【问题标题】:Insert to SQL Server from table type fails if more than 1 row如果超过 1 行,则从表类型插入 SQL Server 失败
【发布时间】: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


【解决方案1】:

检查您的 C# 数据表内容。 “人员”字段中的每个数字都必须是唯一的。程序按设计完美运行​​。

【讨论】:

  • 问题是这个人不是唯一的!!,这个人可以包含多个联系信息..我认为这是问题所在。如何插入具有相同人员ID的多行
  • 这取决于您的业务逻辑。 “PersonContact”表中的“Person”列是唯一的还是主键?
  • 不是唯一也不是主键,不在数据表中也不在sql表中,也不知道为什么不能为同一个人插入2条记录。
  • 起初,它是一个设计得很好的SP。其次,没有重复是常规规范化方法。我猜您需要将 [Type] 列添加到您的 PK 以避免重复。
【解决方案2】:

您的代码在 SQL 端完美运行, 我测试了使用表变量的内容,我看到它按预期与表数据合并

declare @CI as [PersonContactTableType];
insert into @CI values (11,1,'ERALPER'),(12,2,'The Phantom'),(13,2,'Lord Vader'),(14,1,'Kodyaz')
exec [MergeContactInfo] @CI;
go
select * from PersonContact

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2014-06-09
    • 2013-02-03
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多