【问题标题】:Sql Server TVP Merge with Where/Case StatementSql Server TVP 与 Where/Case 语句合并
【发布时间】: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


【解决方案1】:

我主要是在这里猜测,但看起来像这些方面的简单更新应该接近你想要做的。

UPDATE l
SET OriginalSubdivisionName = CASE WHEN l.OriginalSubdivisionName IS NULL THEN L.SubdivisionNam ELSE Tvp.Name END
FROM Listing l
JOIN @CustomSeo Tvp ON Tvp.RecordID = l.ListingID

【讨论】:

  • 完美谢谢 :),tvp 的大多数示例都使用 Merge,我只是尝试使用返回的 kvp,谢谢。
  • MERGE 实际上有一些大问题。有点离题但仍然相关。 mssqltips.com/sqlservertip/3074/…
【解决方案2】:

或者,如果您坚持MERGE 声明:

BEGIN
    MERGE INTO Listings L
    USING @CustomSeo AS Tvp 
        ON Listings.ListingID = @CustomSeo.RecordID

    WHEN MATCHED 
        UPDATE SET 
        L.OriginalSubdivisionName = CASE WHEN L.OriginalSubdivisionName IS NULL 
                                         THEN L.SubdivisionName 
                                         ELSE Tvp.Name END
END

【讨论】:

  • 赞成,因为您是通过合并完成的,我只是无法正确处理案例,也谢谢您
【解决方案3】:

您不需要 MERGE。您需要有条件的 SET ColumnX = (this or that) 语句。

类似的东西。

Update Listings

Set L.OriginalSubdivisionName =
case when L.OriginalSubdivisionName IS NULL Then
L.SubdivisionName
else
L.OriginalSubdivisionName / * a little trick to keep it the same value */
end
,
L.SubdivisionName = 
case
    when L.OriginalSubdivisionName IS NOT NULL
        then Tvp.Name 
    else
    L.SubdivisionName / * a little trick to keep it the same value */
End

From
Listings L 
join
@CustomSeo AS Tvp 
            ON Listings.ListingID = @CustomSeo.RecordID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2013-12-06
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多