web-dev-qa-db-ja.com

DataTableを引数としてストアドプロシージャに渡す

C#で作成されたデータテーブルがあります。

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

これを次のストアドプロシージャに渡します。

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

私の質問は:これらの3つのタプルをSQLテーブルに挿入するにはどうすればよいですか?ドット演算子を使用して列の値にアクセスする必要がありますか?またはこれを行う他の方法はありますか?

9

テーブル値パラメーター を入力として受け入れるようにストアード・プロシージャーを変更できます。ただし、最初に、C#DataTableの構造に一致するユーザー定義のテーブルTYPEを作成する必要があります。

CREATE TYPE dbo.PersonType AS TABLE
(
    Name NVARCHAR(50), -- match the length of SomeTable.Column1
    Age INT
);

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

C#では、データテーブルをPROCパラメーターにバインドするときに、パラメーターを次のように指定する必要があります。

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

こちらの例も参照してください テーブル値パラメータをストアドプロシージャに渡す

12
StuartLC

まず、実際のテーブルに似たユーザー定義タイプのテーブルを作成する必要があります。以下の例を参照してください。

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

それだけです...仕事は終わりました:)

2
Shyju