【发布时间】:2015-06-11 14:19:38
【问题描述】:
我正在做的是非常直接地在几个帖子中挖掘并且无法弄清楚如何正确表达它
TVP 声明
CREATE TYPE [dbo].[CustomSeoDic] as table (
[RecordID] [int] NULL,
[Name] [nvarchar](125) NULL)
GO
尝试 1
BEGIN
MERGE INTO Listings L
USING @CustomSeo AS Tvp
ON Listings.ListingID = @CustomSeo.RecordID
WHEN MATCHED AND L.OriginalSubdivisionName IS NULL THEN
UPDATE SET
L.OriginalSubdivisionName = L.SubdivisionName
WHEN MATCHED AND L.OriginalSubdivisionName IS NOT NULL THEN
UPDATE SET
L.SubdivisionName = Tvp.Name
END
尝试 2
BEGIN
MERGE INTO Listings L
USING @CustomSeo AS Tvp
ON Listings.ListingID = @CustomSeo.RecordID
WHEN MATCHED AND L.OriginalSubdivisionName IS NULL THEN
UPDATE SET
CASE L.OriginalSubdivisionName IS NULL THEN L.OriginalSubdivisionName = L.SubdivisionName
CASE L.OriginalSubdivisionName IS NOT NULL THEN L.SubdivisionName = Tvp.Name
END
收到错误
消息 10714,级别 15,状态 1,过程 Update_SubdivisionNames,第 17 行 “WHEN MATCHED”类型的操作不能在 MERGE 语句的“UPDATE”子句中出现多次。
【问题讨论】:
-
您可能会重新考虑为此使用 MERGE。从尝试 #1 看来,您需要做的就是编写一个带有 ISNULL 的更新
-
恕我直言,当没有相应的“不匹配”时,没有理由编写 MERGE 语句。当您拥有的所有内容都“匹配”时,它只是一个更新语句。为什么要复杂化?
-
因为这是大多数 TVP 示例所显示的......
-
好的。是的,我会从示例中“撤退”一点......然后做一个更新声明。很高兴你成功了。
-
这里是另一个 MERGE 的花絮..我学会了艰难的方式。 (因此只有在真正需要时才使用它的另一个原因)::: weblogs.sqlteam.com/dang/archive/2009/01/31/…
标签: sql sql-server sql-server-2008 table-valued-parameters