2015-04-08 20 views
6

Ho una tabella dati creata in C#.Passare DataTable alla stored procedure come argomento

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); 

Voglio passare questo alla stored procedure seguente.

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

La mia domanda è: Come inseriamo quelle 3 tuple alla tabella di SQL? dobbiamo accedere ai valori della colonna con l'operatore punto? o c'è qualche altro modo per farlo?

risposta

9

È possibile modificare la stored procedure per accettare un table valued parameter come input. Prima però, è necessario creare una tabella di tipo definito dall'utente, che corrisponde alla struttura del C# DataTable:

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

regolare la 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 

Quando si associa il DataTable al parametro PROC, è necessario specificare il parametro come:

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

Vedere anche l'esempio qui Passing a Table-Valued Parameter to a Stored Procedure

+0

Grazie per la risposta. Mi riferisco a MS SQL Server 2012. Questo tipo di creazione non è possibile. Potete fornire un pls alternativo? –

+1

I TVP sono stati resi disponibili in [SQL 2008 già] (https://technet.microsoft.com/en-us/library/bb522526 (v = sql.105) .aspx) – StuartLC

+0

quando ho provato a creare il tipo, esso genera il errore che dice "Errore di sintassi vicino a AS". non riesco a capire perché sta accadendo –

2

Per prima cosa è necessario creare un tipo definito dall'utente di tabella che assomigli alla tabella attuale. Vedere l'esempio di seguito,

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 

Questo è tutto ... lavoro fatto :)

Problemi correlati