使用merge更新表并使用已定义的表类型

时间:2017-01-03 10:36:35

标签: c# sql sql-server

我有一个像这样的存储过程

CREATE PROCEDURE [dbo].[Update_Order]
    @tblOrderProduct [ProductOrderType] READONLY
AS
BEGIN
    SET NOCOUNT ON;

    MERGE INTO tblKmOrder AS c1
    USING @tblOrderProduct c2 ON c1.id = c2.id 

    WHEN MATCHED THEN
        UPDATE 
            SET c1.client = c2.client
END

并按此类型

CREATE TYPE [dbo].[ProductOrderType] AS TABLE(id int, client nvarchar(max) null)

我将datatable作为参数传递给存储过程。问题是值没有正确映射,我使用c1.client = c2.clientc2.client值没有被映射;而是id值被映射,因为我像这样传递数据

id | client 
 1 | somename

我像这样传递

cmd.Parameters.AddWithValue("@" + parameter, dt);

我不明白查询中有什么问题我google了很多但是找不到任何东西

1 个答案:

答案 0 :(得分:1)

.Net DataTable中定义的列必须与用户定义的表类型中定义的列完全匹配,包括列的顺序。

例如,如果用户定义的表类型定义如下:

CREATE TYPE udtt AS TABLE
(
    id int,
    val int
)

您的c#DataTable必须定义如下:

var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("val", typeof(int));

如果列的顺序错误,则会导致存储过程中的列错误。这意味着如果您的数据表定义如下:

var dt = new DataTable();
dt.Columns.Add("val", typeof(int));
dt.Columns.Add("id", typeof(int));

您的存储过程会将数据表中“val”列中的任何内容作为“id”列,反之亦然。