Real-world database-applicaties moeten meerdere verzoeken doen van de front-end naar de database om allerlei functies uit te voeren.
Als een applicatie data-intensief is, zoals die worden gebruikt in banken of luchthavens, enz., kan het aantal datareizen enorm zijn. Elk verzoek aan een database gebruikt bandbreedte en heeft tijd nodig om uit te voeren. Zonder de tabelwaardeparameters moet een frontapplicatie meerdere datatrips maken om meerdere rijen data te manipuleren. Met tabelwaardeparameters kunnen echter meerdere rijen worden ingevoegd, bijgewerkt en verwijderd uit een database met behulp van een enkele geparametreerde opdracht die een tabelwaardeparameter nodig heeft.
Een tabelwaardeparameter is een parameter met een tabeltype. Met deze parameter kunt u meerdere gegevensrijen naar een opgeslagen procedure of een geparametriseerde SQL-opdracht in de vorm van een tabel sturen. Transact-SQL kan worden gebruikt om toegang te krijgen tot de kolomwaarden van de tabelwaardeparameters.
In dit artikel zullen we bestuderen hoe we een gegevenstabel kunnen doorgeven aan een opgeslagen procedure. Laten we echter eerst eens kijken hoe tabelgegevens vroeger werden doorgegeven aan tabelwaardeparameters.
Gegevens in tabelvorm doorgeven aan tabel gewaardeerde parameters
Tabelwaardeparameters werden geïntroduceerd in SQL Server 2008. Voor die tijd waren er beperkte opties om tabelgegevens door te geven aan opgeslagen procedures. De meeste ontwikkelaars gebruikten een van de volgende methoden:
- Gegevens in meerdere kolommen en rijen werden weergegeven in de vorm van een reeks parameters. Het maximum aantal parameters dat kan worden doorgegeven aan een opgeslagen procedure van SQL Server is echter 2.100. Daarom kon in het geval van een grote tafel deze methode niet worden gebruikt. Verder is voorbewerking aan de serverzijde vereist om de afzonderlijke parameters in tabelvorm te formatteren.
- Maak meerdere SQL-instructies die van invloed kunnen zijn op meerdere rijen, zoals UPDATE. De afschriften kunnen afzonderlijk of in batchvorm naar de server worden verzonden. Zelfs als ze in batchvorm worden verzonden, worden de instructies afzonderlijk op de server uitgevoerd.
- Een andere manier is om begrensde tekenreeksen of XML-documenten te gebruiken om gegevens uit meerdere rijen en kolommen te bundelen en deze tekstwaarden vervolgens door te geven aan geparametreerde SQL-instructies of opgeslagen procedures. Het nadeel van deze aanpak was dat je de datastructuur moest valideren om de waarden te ontbundelen.
Datatabel doorgeven als parameter aan opgeslagen procedures
Laten we nu eens kijken hoe parameters met tabelwaarde kunnen worden gebruikt om gegevens naar een opgeslagen procedure te verzenden zonder de problemen op te lossen die in de vorige sectie zijn besproken. Met parameters met tabelwaarde kunnen meerdere rijen gegevens worden doorgegeven aan een opgeslagen procedure door een Transact-SQL-code of vanuit een front-endtoepassing. De maximale grootte die een parameter met tabelwaarde kan hebben, is gelijk aan de maximale geheugengrootte van de databaseserver.
In deze sectie gebruiken we tabelwaardeparameters samen met een opgeslagen procedure om meerdere rijen in een gegevenstabel in te voegen.
Het doorgeven van tabelwaardeparameters aan een opgeslagen procedure is een proces in drie stappen:
- Maak een door de gebruiker gedefinieerd tabeltype dat overeenkomt met de tabel die u wilt vullen.
- Geef de door de gebruiker gedefinieerde tabel als parameter door aan de opgeslagen procedure
- Selecteer in de opgeslagen procedure de gegevens van de doorgegeven parameter en plaats deze in de tabel die u wilt invullen.
Laten we eens kijken naar een voorbeeld van hoe we een gegevenstabel kunnen doorgeven aan een opgeslagen procedure met behulp van een functie met tabelwaarde.
Maak eerst een tabel die we willen vullen. Voer het volgende script uit:
CREATE DATABASE ShowRoom USE ShowRoom Create Table Cars ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
In het bovenstaande script maken we een database met de naam ShowRoom met één tabel, namelijk Cars. De tabel Cars heeft drie kolommen:Id, Name en company. We zullen een opgeslagen procedure gebruiken om de Cars-tabel te vullen.
Zoals eerder beschreven, is de eerste stap het maken van een door de gebruiker gedefinieerd tabeltype dat overeenkomt met de tabel die u wilt vullen. Voer hiervoor het volgende script uit:
CREATE TYPE CarTableType AS TABLE ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
In het bovenstaande script maken we de door de gebruiker gedefinieerde CarTableType-variabele van het type Tabel. Dit is de variabele die we zullen doorgeven aan de opgeslagen procedure. Het is te zien dat de kolommen van de CarTableType-variabele vergelijkbaar zijn met die in de Cars-tabel.
Laten we nu een opgeslagen procedure maken die de CarTableType-variabele als parameter accepteert. Binnen de opgeslagen procedure zullen we alle records van deze variabele SELECTEREN en invoegen in de Cars-tabel. Voer het volgende script uit om zo'n opgeslagen procedure te maken:
CREATE PROCEDURE spInsertCars @CarType CarTableType READONLY AS BEGIN INSERT INTO Cars SELECT * FROM @CarType END
In het bovenstaande script maken we de spInsertCars opgeslagen procedure. Het is belangrijk om te vermelden dat u de door de gebruiker gedefinieerde parameter moet specificeren als READONLY in de opgeslagen procedure, als u dit niet doet, resulteert dit in een runtime-fout.
U kunt zien dat de spInsertCars-opslagprocedure de CarTableType-parameter accepteert en deze toewijst aan de @CarType-variabele van het CarTableType-type.
De laatste stap is om een variabele van de CarTableType-variabele te maken, deze te vullen met dummy-gegevens en deze door te geven aan de spInsertCars-opslagprocedure. Bekijk het volgende script:
DECLARE @CarTableType CarTableType INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota') INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda') INSERT INTO @CarTableType VALUES (3, '6', 'Audi') INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez') INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford') EXECUTE spInsertCars @CarTableType
In het bovenstaande script declareren we eerst de @CarTableType-variabele van het type CarTableType. Vervolgens voegen we 5 dummy-records in deze variabele in. Ten slotte voeren we de spInsertCars-opslagprocedure uit en geven deze de variabele @CarTableType als parameter door.
Binnen de opgeslagen procedure worden vijf records van de @CarTableType-variabele geselecteerd en ingevoegd in de tabel Cars. Als u nu alle records uit de tabel Cars selecteert, zou u de nieuw ingevoegde records moeten zien. Voer hiervoor het volgende script uit:
SELECT * FROM Cars
De uitvoer van het bovenstaande script ziet er als volgt uit:
Uit de uitvoer blijkt dat alle records van de @CarTableType-variabele zijn ingevoegd in de tabel Cars.