2015-04-08 15 views
6

Ich habe eine Datentabelle in C# erstellt.Übergabe von DataTable an gespeicherte Prozedur als Argument

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

Ich möchte dies an die folgende gespeicherte Prozedur übergeben.

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

Meine Frage ist: Wie fügen wir diese 3 Tupel in die SQL-Tabelle ein? Müssen wir mit dem Punktoperator auf die Spaltenwerte zugreifen? oder gibt es eine andere Möglichkeit, dies zu tun?

Antwort

9

Sie können die gespeicherte Prozedur ändern, um eine table valued parameter als Eingabe zu akzeptieren. jedoch Zunächst müssen Sie eine benutzerdefinierte Tabelle TYPE schaffen, die die Struktur des C# Datentabelle entspricht:

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

Passen Sie Ihre 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 

Wenn Sie die Datentabelle auf die PROC Parameter binden, Sie müssen die Parameter angeben:

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

Siehe auch das Beispiel hier Passing a Table-Valued Parameter to a Stored Procedure

+0

Vielen Dank für Ihre Antwort. Ich beziehe mich auf MS SQL Server 2012. Diese Art der Erstellung ist nicht möglich. Können Sie eine alternative pls bereitstellen? –

+1

TVPs wurden in [SQL 2008 bereits verfügbar gemacht] (https://technet.microsoft.com/en-us/library/bb522526 (v = sql.105) .aspx) – StuartLC

+0

Wenn ich versuchte, den Typ zu erstellen, generiert es die Fehler, der "Syntaxfehler nahe AS sagt". kann nicht herausfinden, warum es passiert –

2

Zuerst müssen Sie einen benutzerdefinierten Typ von Tabelle erstellen, der Ihrer tatsächlichen Tabelle ähnelt. Siehe das Beispiel unten,

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 

Das ist es ... Job done :)

Verwandte Themen