4

这是我的 SQL 语句的一部分:

MERGE INTO Scyk.dbo.Threads AS d
USING (SELECT Id,Question,QuestionTitle, Answer, Category FROM Homework.dbo.Zadanes) AS s
ON 1 = 2 
   WHEN NOT MATCHED THEN
      INSERT (CurrentValue, NumberOfPosts, TotalValue, Views, Title, DateCreated, LastPostAuthor, LastPostDateTime, IsDeleted, Restricted, RestrictWrite, Sticked, CategoryName, AuthorUserName)
      VALUES (0, 2, 0, 0, s.QuestionTitle, CURRENT_TIMESTAMP, 'zadania', DATEADD(second, 1, CURRENT_TIMESTAMP), 0, 0, 0, 0, s.Category, 'zadania')

这是我得到的错误:

MERGE 语句与 FOREIGN KEY 约束“FK_dbo.Threads_dbo.Categories_CategoryName”冲突。冲突发生在数据库“Scyk”、表“dbo.Categories”、“名称”列中。

所以我做的第一件事就是检查外键完整性:

SELECT Distinct(Category) FROM [Homework].[dbo].[Zadanes]
where not exists
(select distinct(Name) from Scyk.dbo.Categories)

但这什么也没返回,这意味着外键是好的。那么这里发生了什么?

4

2 回答 2

5

您应该停止使用MERGE,恕我直言,而只需使用普通的INSERT. 你MERGE在这里买什么?

在部分或所有受支持的 SQL Server 版本中,至少有 15 个错误未修复:

听起来这是导致您的问题的原因,并且已因无法修复而关闭。最后一个可能会解决您的问题从 KB #956718 获得修复),但不知何故我对此表示怀疑。即使确实如此,您也可能会受到其中列出的其他 14 个中的一个(或尚未发现的另一个)的影响。可悲的是,这是一个用最少的测试发布一个半成品的功能,然后在 3+ 版本中忽略它的情况。

如果你想检查外键,你的查询应该是这样的:

SELECT Distinct(Category) FROM [Homework].[dbo].[Zadanes] AS z
where not exists
(select 1 from Scyk.dbo.Categories AS c WHERE c.name = z.Category);

虽然奇怪的是名称上有外键而不是 CategoryID。当名字改变时会发生什么?您是否设置了级联选项?'Electronics'在 中的每一行中重复或更长的类别名称浪费了多少空间Zadanes

于 2013-11-06T20:16:59.997 回答
5

发生的事情是您的查询说

从中选择任何类别,Homework.dbo.Zadanes但前提是 中没有行Scyk.dbo.Categories

后一个表中大概有行,因此您的查询没有返回任何内容。

尝试

SELECT z.Category 
  FROM [Homework].[dbo].[Zadanes] z LEFT OUTER JOIN
       [Scyk].[dbo].[Categories] c
    ON z.Category = c.Name
 WHERE c.Name IS NULL
 GROUP BY z.Category

此外,除非您使用该OUTPUT子句一次重新映射一堆 ID,否则没有理由使用MERGE.INSERT

于 2013-11-06T19:49:49.207 回答