CREATE TYPE [AS TABLE] – przekazanie tabeli do procedury

Z dokumentacji technet ( http://msdn.microsoft.com/en-us/library/ms175007%28v=sql.105%29.aspx )

Creates an alias data type or a user-defined type in the current database. The implementation of an alias data type is based on a SQL Server native system type. A user-defined type is implemented through a class of an assembly in the Microsoft .NET Framework common language runtime (CLR). To bind a user-defined type to its implementation, the CLR assembly that contains the implementation of the type must first be registered in SQL Server by using CREATE ASSEMBLY.

W SQL Server istnieje możliwość definiowania własnych typów danych. Dzięki temu można wcześniej stworzyć kilka przydatnych typów a później już tylko odowoływac się do nich po nazwie. Prócz tych zbudowanych ze standardowych definicji dostępnych w każdej bazie, można również budować złożone typy w C# i importowac je tą metodą. (szczegóły w dokumentacji)

Jednak najbardziej przydatną jest jeszcze jedna, ta która pozwala na zdefiniowanie zmiennej jako tabeli. Przy jej użyciu możemy przekazać wartości do procedury 🙂
Oczywiście przechowywanie dużej ilości danych w zmiennej nie jest najlepszym pomysłem, zwłaszcza tam, gdzie trzeba je jeszcze przeszukać (tu zdecydowanie lepszym rozwiązaniem są zwykłe tabele). Ale do przekazania niewielkiej ilości danych to rozwiązanie może trochę ułatwić życie.

Przykład
Stworzymy typ tabelaryczny, który zawiera jedno pole identity (pk) i dwa inne (int i varchar)
Następnie procedura, która w definicji będzie używała za argument nasz nowy typ, wewnątrz ma wykonac select z przekazanej tabeli.

Jedziemy:

SET NOCOUNT ON
--pomijaj wyswietlanie ilosci rekordow

CREATE TYPE MojaDefinicjaTabeli AS TABLE --definicja tabeli jako typ danych
( ID INT IDENTITY PRIMARY KEY,
col1 INT DEFAULT 666,
col2 NVARCHAR(50) DEFAULT N'tam, gdzie kończą się plecy'
)
GO

CREATE PROCEDURE Procedurka --tworzymy procedure
    (
      @wejsciowaTabela MojaDefinicjaTabeli READONLY --ktora na wejsciu pobiera parametr typu MojaDefinicjaTabeli, READONLY jest obowiazkowy!
    )
AS 
    SELECT  *
    FROM    @wejsciowaTabela
GO

DECLARE @Tabelunia MojaDefinicjaTabeli
 --tworzymy sobie zmienna

INSERT  INTO @Tabelunia --dodajemy do niej wartosci
        ( col1, col2 )
        DEFAULT VALUES
 --defaultowe
INSERT  INTO @Tabelunia
VALUES  ( 123456, 'tutiturumtutu' )
 --jakies swoje

EXEC Procedurka @Tabelunia
 -- Voilà!!

--porzadki
DROP PROCEDURE Procedurka
DROP TYPE MojaDefinicjaTabeli

Wynik:

POST PIERWOTNIE OPUBLIKOWANY JAKO TSQL NA DZIŚ #21

 

 

Dodaj komentarz