2015-04-08 13 views
6

Mam tabelę danych utworzoną w języku C#.Przekazywanie Data Data do procedury składowanej jako argumentu

DataTable dt = new DataTable(); 
dt.Columns.Add("Name", typeof(string)); 
dt.Columns.Add("Age", typeof(int)); 

dt.Rows.Add("James", 23); 
dt.Rows.Add("Smith", 40); 
dt.Rows.Add("Paul", 20); 

Chcę przekazać to do poniższej procedury przechowywanej.

CREATE PROCEDURE SomeName(@data DATATABLE) 
AS 
BEGIN 
    INSERT INTO SOMETABLE(Column2,Column3) 
    VALUES(......); 
END 

Moje pytanie brzmi: jak wstawić te 3 krotki do tabeli SQL? czy musimy uzyskać dostęp do wartości kolumny za pomocą operatora kropki? czy jest jakiś inny sposób robienia tego?

Odpowiedz

9

Możesz zmienić procedurę składowaną, aby zaakceptować table valued parameter jako dane wejściowe. Najpierw jednak trzeba będzie utworzyć zdefiniowany przez użytkownika typ wykresu, który pasuje do struktury C# DataTable:

CREATE TYPE dbo.PersonType AS TABLE 
(
    Name NVARCHAR(50), -- or whatever the length of the `SOMETABLE` column 
    Age INT 
); 

wyregulować sproc:

CREATE PROCEDURE dbo.InsertPerson 
    @Person dbo.PersonType READONLY 
AS 
BEGIN 
    INSERT INTO SomeTable(Column1, Column2) 
    SELECT p.Name, p.Age 
    FROM @Person p; 
END 

Kiedy powiązać DataTable do parametru PROC, trzeba określić parametr jako:

parameter.SqlDbType = SqlDbType.Structured; 
parameter.TypeName = "dbo.PersonType"; 

Zobacz także przykład tutaj Passing a Table-Valued Parameter to a Stored Procedure

+0

Dziękuję za odpowiedź. Mam na myśli MS SQL Server 2012. Tworzenie tego typu nie jest możliwe. Czy możesz podać alternatywny pls? –

+1

Programy TVP zostały udostępnione już w [SQL 2008] (https://technet.microsoft.com/en-us/library/bb522526 (v = sql.105) .aspx) – StuartLC

+0

kiedy spróbowałem utworzyć typ, generuje on błąd z informacją "błąd składni w pobliżu AS". nie rozumiem, dlaczego tak się dzieje –

2

Najpierw należy utworzyć tabelę typu Userdefined, która będzie podobna do rzeczywistej tabeli. Patrz poniższy przykład,

CREATE TYPE SomeType AS TABLE 
(
    C1 int, 
    C2 VARCHAR(50) 
) 
After this you need to create a stored procedure that takes this table type as parameter. 


CREATE PROCEDURE SomeUSP 
    @tabType SomeType READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Yourtable(C1,C2) 
    SELECT C1,C2 FROM @tabType 
END 

... to jest to zadanie :)