Databaseapplikationer i den virkelige verden skal lave flere anmodninger fra frontend til databasen for at kunne udføre alle mulige funktioner.
Hvis en applikation er dataintensiv, såsom dem der bruges i banker eller lufthavne osv., kan antallet af datarejser være enormt. Hver anmodning til en database bruger båndbredde og kræver tid at udføre. Uden de tabelværdierede parametre skal en frontapplikation foretage flere datature for at manipulere flere rækker af data. Men med tabelværdiparametre kan flere rækker indsættes, opdateres og slettes fra en database ved hjælp af en enkelt parameteriseret kommando, der tager en tabelværdiparameter.
En tabelværdiparameter er en parameter med en tabeltype. Ved at bruge denne parameter kan du sende flere rækker af data til en lagret procedure eller en parameteriseret SQL-kommando i form af en tabel. Transact-SQL kan bruges til at få adgang til kolonneværdierne for de tabelværdisatte parametre.
I denne artikel vil vi studere, hvordan vi kan overføre en datatabel til en lagret procedure. Men før det, lad os se, hvordan tabeldata plejede at blive sendt før tabelværdierede parametre.
Videregivelse af data i tabelform før tabelværdiparametre
Parametre med tabelværdier blev introduceret i SQL Server 2008. Før det var der begrænsede muligheder for at videregive tabeldata til lagrede procedurer. De fleste udviklere brugte en af følgende metoder:
- Data i flere kolonner og rækker blev repræsenteret i form af en række parametre. Det maksimale antal parametre, der kan overføres til en lagret SQL Server-procedure, er dog 2.100. Derfor kunne denne metode ikke bruges i tilfælde af et stort bord. Desuden kræves der forbehandling på serversiden for at formatere de enkelte parametre til en tabelform.
- Opret flere SQL-sætninger, der kan påvirke flere rækker, såsom UPDATE. Opgørelserne kan sendes til serveren individuelt eller i batchform. Selvom de sendes i batchform, udføres sætningerne individuelt på serveren.
- En anden måde er at bruge afgrænsede strenge eller XML-dokumenter til at samle data fra flere rækker og kolonner og derefter sende disse tekstværdier til parameteriserede SQL-sætninger eller lagrede procedurer. Ulempen ved denne tilgang var, at du skulle validere datastrukturen for at adskille værdierne.
Videre datatabel som parameter til lagrede procedurer
Lad os nu se, hvordan tabelværdisatte parametre kan bruges til at sende data til en lagret procedure uden at stå over for nogen af de problemer, der blev diskuteret i det foregående afsnit. Parametre med tabelværdier tillader, at flere rækker af data kan overføres til en lagret procedure med en eller anden Transact-SQL-kode eller fra front-end-applikation. Den maksimale størrelse, som en tabelværdiparameter kan have, er lig med den maksimale hukommelsesstørrelse på databaseserveren.
I dette afsnit vil vi bruge tabelværdierede parametre sammen med en lagret procedure til at indsætte flere rækker i en datatabel.
Overførsel af tabelværdiparametre til en lagret procedure er en proces i tre trin:
- Opret en brugerdefineret tabeltype, der svarer til den tabel, du vil udfylde.
- Vis den brugerdefinerede tabel til den lagrede procedure som en parameter
- Inde i den lagrede procedure skal du vælge data fra den beståede parameter og indsætte den i den tabel, du vil udfylde.
Lad os tage et kig på et eksempel på, hvordan vi kan overføre en datatabel til en lagret procedure ved hjælp af en tabelværdi-funktion.
Først skal du oprette en tabel, som vi vil udfylde. Udfør følgende script:
CREATE DATABASE ShowRoom USE ShowRoom Create Table Cars ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
I scriptet ovenfor opretter vi en database kaldet ShowRoom med én tabel, dvs. Biler. Tabellen Biler har tre kolonner:Id, Navn og firma. Vi vil bruge en lagret procedure til at udfylde tabellen Biler.
Som beskrevet tidligere er det første trin at oprette en brugerdefineret tabeltype, der svarer til den tabel, du vil udfylde. Udfør følgende script for at gøre det:
CREATE TYPE CarTableType AS TABLE ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
I scriptet ovenfor opretter vi den CarTableType brugerdefinerede variabel af tabeltypen. Dette er den variabel, som vi vil videregive til den lagrede procedure. Det kan ses, at kolonnerne i CarTableType-variablen ligner dem i Cars-tabellen.
Lad os nu oprette en lagret procedure, der accepterer CarTableType-variablen som en parameter. Inde i den lagrede procedure vil vi SELECT alle posterne fra denne variabel og indsætte dem i Cars-tabellen. Udfør følgende script for at oprette en sådan lagret procedure:
CREATE PROCEDURE spInsertCars @CarType CarTableType READONLY AS BEGIN INSERT INTO Cars SELECT * FROM @CarType END
I ovenstående script opretter vi spInsertCars lagrede procedure. Det er vigtigt at nævne, at du skal angive den brugerdefinerede parameter som READONLY i den lagrede procedure, hvis du ikke gør det, resulterer det i en runtime-fejl.
Du kan se, at spInsertCars lagrede procedure accepterer CarTableType-parameteren og tildeler den til @CarType-variablen af CarTableType-typen.
Det sidste trin er at oprette en variabel af CarTableType-variablen, udfylde den med dummy-data og videregive den til spInsertCars-lagrede procedure. Tag et kig på følgende 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
I scriptet ovenfor erklærer vi først @CarTableType-variablen af typen CarTableType. Vi indsætter derefter 5 dummy-poster i denne variabel. Til sidst udfører vi spInsertCars lagrede procedure og sender den @CarTableType-variablen som en parameter.
Inde i den lagrede procedure vælges fem poster fra @CarTableType-variablen og indsættes i Cars-tabellen. Hvis du nu vælger alle posterne fra Biler-tabellen, bør du se de nyligt indsatte poster. Udfør følgende script for at gøre det:
SELECT * FROM Cars
Outputtet af scriptet ovenfor ser sådan ud:
Det kan ses på outputtet, at alle poster fra @CarTableType-variablen er blevet indsat i Cars-tabellen.