【问题标题】:SQL Server - Error in MERGESQL Server - 合并错误
【发布时间】:2017-10-06 10:23:02
【问题描述】:

EDITED:我把表结构和真正的MERGE放在一起

我正在尝试在 Microsoft SQLServer 2014 中使用 MERGE,但在目标表中出现语法错误:

MERGE VALORATION_DETAIL_INPUTS_LIMIT AS Target
USING (VALUES (922, 4098)) AS Source(idValoration, idDetValInput)
ON (Source.idValoration = Target.idValoration AND Source.idDetValInput = Target.idDetValInput)
WHEN MATCHED THEN  
    UPDATE SET idSubject = 1633, idGood = 1114, idWarranty = 7519, idSubWarranty = 7520, units = 1.000000,
               unitPrice = 250.000000, limit = 250.000000, percTax = 21.000000, tax = 52.500000, subtotal = 197.500000,
               total = 250.000000 
WHEN NOT MATCHED BY TARGET THEN
    INSERT (idDetValInput, idValoration, idSubject, idGood, idWarranty, idSubWarranty, units,
            unitPrice, limit, percTax, tax, subtotal, total) 
    VALUES(4093, 922, 1633, 1114, 7519, 7520, 1.000000, 250.000000, 250.000000, 21.000000, 52.500000, 197.500000, 250.000000)
OUTPUT $ACTION

错误是:

Msg 156, Level 15, State 1, Line ... Incorrect syntax near the word 'AS'.

表结构:

CREATE TABLE VALORATION_DETAIL_INPUTS_LIMIT
(
    idDetValInput bigint NOT NULL,
    idValoration bigint NOT NULL,
    idSubject bigint NOT NULL,
    idGood int NULL,
    idWarranty int NULL,
    idSubWarranty int NULL,
    units real NULL,
    unitPrice money NULL,
    limit money NULL,
    percTax real NULL,
    tax money NULL,
    subtotal money NULL,
    total money NULL
)

【问题讨论】:

  • 您的查询中没有“第 14 行”。
  • 嗯,我之前有一个“USE”和一个“GO”。我觉得没必要这么说。
  • 现在,您的问题不同了。 “INSERT 语句中的列数多于 VALUES 子句中指定的值。VALUES 子句中的值数必须与 INSERT 语句中指定的列数相匹配。”所以,我所做的是在 INSERT 语句的 VALUES 部分的末尾添加两个值,它工作正常。简而言之,INSERT 语句中指定的 13 列比 INSERT 语句的 VALUES 部分提供的 11 个 VALUES 多。还有 2 个值需要在那里提供。
  • 修复了这个问题,仍然出现同样的错误(从来没有得到你说的那个,你)。
  • 然后,该错误不在 MERGE 中,我在新窗口中的新数据库上运行了您的表脚本 + 您的合并脚本,在我向​​其添加值后它工作正常。

标签: sql sql-server tsql merge


【解决方案1】:
  1. 使用 values 子句代替通过 SELECT 创建 Source 表,或者您也可以使用用户 @m.benslimane 建议的选项。

  2. 另外,由于您正在更新 Target,因此您无需在 INSERT 语句中使用 Target.id、Target.value。

  3. 这很可能是 POC 代码,因为您正在使用静态值进行更新。在实际查询中请注意这一点。

    MERGE VALORATION_DETAIL_INPUTS_LIMIT AS Target
    
     USING (VALUES (922, 4098)) AS Source(idValoration, idDetValInput)
    
     ON (Source.idValoration = Target.idValoration 
     AND Source.idDetValInput = Target.idDetValInput)
     WHEN MATCHED THEN  
    
    UPDATE SET idSubject = 1633, idGood = 1114, idWarranty = 7519, 
       idSubWarranty = 7520, units = 1.000000,
       unitPrice = 250.000000, limit = 250.000000, 
       percTax = 21.000000, tax = 52.500000, subtotal = 197.500000,
       total = 250.000000 
    WHEN NOT MATCHED BY TARGET THEN
    
    INSERT (idDetValInput, idValoration, idSubject, idGood, 
            idWarranty, idSubWarranty, units,unitPrice, 
            limit, percTax, tax, subtotal, total) 
    
    VALUES(1633, 1114, 7519, 7520, 1.000000, 
           250.000000, 250.000000, 21.000000, 
           52.500000, 197.500000, 250.000000, 
           --DUMMY VALUES I ADDED  BELOW
           20.00, 20.00)
    
    OUTPUT $ACTION;
    

【讨论】:

  • 我修复了这些问题,感谢您的提示。但我仍然遇到同样的错误。看起来 SQL Server 不喜欢 MERGE,:(
  • @AndrésMarotta 我创建了一个表,并在我看到它工作正常后运行了我粘贴在这里的查询。你能把你的表结构也粘贴到查询中吗?
  • 另外,您使用的是哪个版本的 SQL Server?
  • 我正在使用 Microsoft SQLServer 2014。我将使用表结构更新问题。
  • 它是否认为以下内容;使用 (VALUES (922, 4098)) 作为 Source(idValoration, idDetValInput) 它们是不同的类型,即不是 bigint?
【解决方案2】:

您需要在作为源之后添加 (id,value)。

像这样:

.... Target
USING (SELECT 922 AS id, 4098 AS value) AS Source (id,value)
ON ........

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多