Databasapplikationer i den verkliga världen måste göra flera förfrågningar från fronten till databasen för att kunna utföra alla möjliga funktioner.
Om en applikation är dataintensiv, som de som används i banker eller flygplatser etc, kan antalet dataresor vara enormt. Varje begäran till en databas använder bandbredd och kräver tid att utföra. Utan de tabellvärdade parametrarna måste en frontapplikation göra flera dataresor för att kunna manipulera flera rader med data. Men med tabellvärderade parametrar kan flera rader infogas, uppdateras och raderas från en databas med ett enda parameteriserat kommando som tar en tabellvärderad parameter.
En tabellvärderad parameter är en parameter med en tabelltyp. Med den här parametern kan du skicka flera rader med data till en lagrad procedur eller ett parameteriserat SQL-kommando i form av en tabell. Transact-SQL kan användas för att komma åt kolumnvärdena för de tabellvärdade parametrarna.
I den här artikeln kommer vi att studera hur vi kan skicka en datatabell till en lagrad procedur. Men innan dess, låt oss se hur tabelldata brukade skickas före tabellvärdade parametrar.
Visa data i tabellform före tabellvärderade parametrar
Tabellvärdade parametrar introducerades i SQL Server 2008. Innan dess fanns det begränsade möjligheter att skicka tabelldata till lagrade procedurer. De flesta utvecklare använde någon av följande metoder:
- Data i flera kolumner och rader representerades i form av en serie parametrar. Det maximala antalet parametrar som kan skickas till en lagrad SQL Server-procedur är dock 2 100. Därför, i fallet med ett stort bord, kunde denna metod inte användas. Dessutom krävs förbearbetning på serversidan för att formatera de individuella parametrarna till en tabellform.
- Skapa flera SQL-satser som kan påverka flera rader, till exempel UPDATE. Utlåtandena kan skickas till servern individuellt eller i batchform. Även om de skickas i batchform, exekveras satserna individuellt på servern.
- Ett annat sätt är att använda avgränsade strängar eller XML-dokument för att bunta data från flera rader och kolumner och sedan skicka dessa textvärden till parameteriserade SQL-satser eller lagrade procedurer. Nackdelen med detta tillvägagångssätt var att du behövde validera datastrukturen för att dela upp värdena.
Vidare datatabell som parameter till lagrade procedurer
Låt oss nu se hur tabellvärdade parametrar kan användas för att skicka data till en lagrad procedur utan att möta några av de problem som diskuterades i föregående avsnitt. Parametrar med tabellvärde gör att flera rader med data kan skickas till en lagrad procedur med någon Transact-SQL-kod eller från front-end-applikation. Den maximala storleken som en tabellvärderad parameter kan ha är lika med den maximala minnesstorleken för databasservern.
I det här avsnittet kommer vi att använda tabellvärdade parametrar tillsammans med en lagrad procedur för att infoga flera rader i en datatabell.
Att skicka tabellvärdade parametrar till en lagrad procedur är en process i tre steg:
- Skapa en användardefinierad tabelltyp som motsvarar tabellen som du vill fylla i.
- Överför den användardefinierade tabellen till den lagrade proceduren som en parameter
- Inuti den lagrade proceduren, välj data från den skickade parametern och infoga den i tabellen som du vill fylla i.
Låt oss ta en titt på ett exempel på hur vi kan skicka en datatabell till en lagrad procedur med hjälp av tabellvärderad funktion.
Skapa först en tabell som vi vill fylla i. Kör följande skript:
CREATE DATABASE ShowRoom USE ShowRoom Create Table Cars ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
I skriptet ovan skapar vi en databas som heter ShowRoom med en tabell dvs Bilar. Tabellen Bilar har tre kolumner:Id, Namn och företag. Vi kommer att använda en lagrad procedur för att fylla i tabellen Bilar.
Som beskrivits tidigare är det första steget att skapa en användardefinierad tabelltyp som motsvarar den tabell som du vill fylla i. Kör följande skript för att göra det:
CREATE TYPE CarTableType AS TABLE ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
I skriptet ovan skapar vi den användardefinierade CarTableType-variabeln av typen Tabell. Detta är variabeln som vi kommer att skicka till den lagrade proceduren. Det kan ses att kolumnerna i CarTableType-variabeln liknar kolumnerna i Cars-tabellen.
Låt oss nu skapa en lagrad procedur som accepterar CarTableType-variabeln som en parameter. Inuti den lagrade proceduren kommer vi att VÄLJA alla poster från denna variabel och infoga dem i tabellen Bilar. Kör följande skript för att skapa en sådan lagrad procedur:
CREATE PROCEDURE spInsertCars @CarType CarTableType READONLY AS BEGIN INSERT INTO Cars SELECT * FROM @CarType END
I skriptet ovan skapar vi spInsertCars lagrade procedur. Det är viktigt att nämna att du måste ange den användardefinierade parametern som READONLY i den lagrade proceduren, om du inte gör det resulterar det i ett körtidsfel.
Du kan se att spInsertCars lagrade procedur accepterar CarTableType-parametern och tilldelar den till @CarType-variabeln av typen CarTableType.
Det sista steget är att skapa en variabel av CarTableType-variabeln, fylla i den med dummydata och skicka den till spInsertCars lagrade procedur. Ta en titt på följande skript:
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
I skriptet ovan deklarerar vi först @CarTableType-variabeln av typen CarTableType. Vi infogar sedan 5 dummy-poster i denna variabel. Slutligen kör vi spInsertCars lagrade procedur och skickar @CarTableType variabeln som en parameter.
Inuti den lagrade proceduren väljs fem poster från variabeln @CarTableType och infogas i tabellen Bilar. Om du nu väljer alla poster från tabellen Bilar, bör du se de nyligen infogade posterna. Kör följande skript för att göra det:
SELECT * FROM Cars
Utdata från skriptet ovan ser ut så här:
Det kan ses från utdata att alla poster från @CarTableType-variabeln har infogats i Cars-tabellen.