【发布时间】:2019-06-20 14:09:41
【问题描述】:
以下过程从 C# 获取数据作为数据表。我确信该表是与多行一起发送的。如果确实有多行,则不插入数据,但如果数据表仅包含一行,则插入没有任何问题。
ALTER PROCEDURE [dbo].[MergeContactInfo]
@ContactInfo dbo.[PersonContactTableType] READONLY
AS
BEGIN
MERGE INTO PersonContact AS pc
USING @ContactInfo AS ci ON pc.Person = ci.Person
WHEN MATCHED THEN
UPDATE SET pc.Value = ci.Value, pc.Type = ci.Type
WHEN NOT MATCHED THEN
INSERT VALUES(ci.Person, ci.Type, ci.Value);
END
任何为什么不插入多行而只插入一行的解决方案,没有唯一约束。
@Contact Info 如下
CREATE TYPE [dbo].[PersonContactTableType] AS TABLE(
[Person] [int] NOT NULL,
[Type] [tinyint] NOT NULL,
[Value] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED ([Person] ASC) WITH (IGNORE_DUP_KEY = OFF)
)
GO
【问题讨论】:
-
你能举例说明@Contactinfo 可能包含的内容吗?
-
有多行时会出现什么错误。
-
完全没有错误,只是没有插入数据。
-
@Contact Info 是联系人信息的表类型 CREATE TYPE [dbo].[PersonContactTableType] AS TABLE( [Person] [int] NOT NULL, [Type] [tinyint] NOT NULL, [Value ] [varchar](100) NOT NULL, PRIMARY KEY CLUSTERED ([Person] ASC)WITH (IGNORE_DUP_KEY = OFF)) GO
-
我建议您在 SP 中添加一个步骤,将表值写入 SQL Server 中的表。这将让您验证是否收到了多行,还可以让您手动合并记录并确认没有错误。您可能应该包含发送行的任何代码
标签: c# sql sql-server datatable