【问题标题】:Passing DataTable to stored procedure as an argument将 DataTable 作为参数传递给存储过程
【发布时间】:2015-04-08 06:39:14
【问题描述】:

我有一个用 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 表中?我们是否需要使用点运算符访问列值?还是有其他方法可以做到这一点?

【问题讨论】:

    标签: c# sql-server tsql stored-procedures ado.net


    【解决方案1】:

    您可以更改存储过程以接受table valued parameter 作为输入。但是,首先,您需要创建一个与 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";
    

    参见此处的示例Passing a Table-Valued Parameter to a Stored Procedure

    【讨论】:

    • 感谢您的回答。我指的是 MS SQL Server 2012。无法在其中创建这种类型。你能提供一个替代方案吗?
    • TVP 在SQL 2008 already 中提供
    • 当我尝试创建类型时,它会生成错误消息“AS 附近的语法错误”。不知道为什么会这样
    • 你能不能快点SELECT @@VERSION。我猜你是
    • 这很可悲。如果您无法升级,请搜索使用 Xml 将集合和图形传递给存储过程的技术。然后,您将在数据访问层中将 DataSet 序列化为 Xml,然后在您的 proc 中解析 @Xml。然而,它真的很乱。
    【解决方案2】:

    首先,您需要创建一个类似于您的实际表的用户定义类型的表。看下面的例子,

    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
    

    就是这样......工作完成:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多