我在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表中?我们需要用点运算符访问列值吗?或者还有别的办法吗?
最佳答案
您可以更改存储过程以接受table valued parameter作为输入。但是,首先需要创建一个与c datatable的结构匹配的用户定义表类型:
CREATE TYPE dbo.PersonType AS TABLE
(
Name NVARCHAR(50), -- match the length of SomeTable.Column1
Age INT
);
调整存储过程:
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";
另请参见此处的示例Passing a Table-Valued Parameter to a Stored Procedure