【问题标题】:Incorrect syntax near the keyword 'convert'. In Merge statement SQL Server关键字“转换”附近的语法不正确。在合并语句 SQL Server
【发布时间】:2018-02-12 10:08:06
【问题描述】:

我有一个表格测试,其中 1 列的数据类型为 ntext。

我正在写下面的查询:

when matched and TARGET.Module_ID<>SOURCE.Module_ID

THEN 
UPDATE SET TARGET.Module_ID=SOURCE.Module_ID 

但它给了我一个错误

The data types ntext and ntext are incompatible in the not equal to operator.

然后我将查询更改为

when matched and TARGET.convert(varchar(max),Module_ID) <> SOURCE.convert(varchar(max),Module_ID)

它给了我一个错误

   Incorrect syntax near the keyword 'convert'. 

查询有什么问题?

【问题讨论】:

  • 您的表格设计似乎不一致。更改列数据类型,错误就会消失!如果您必须进行转换/投射才能加入,那么您就如履薄冰。
  • CONVERT 是保留关键字。你必须逃脱它[CONVERT]
  • TARGET.Convert? CONVERT 的正确语法是 CONVERT([datatype], [source column])。没有优先关键字。

标签: sql sql-server sql-server-2008 merge


【解决方案1】:

您查看过CONVERT 的文档吗? 你可以这样使用它:

convert(varchar(max), TARGET.Module_ID) <> convert(varchar(max), SOURCE.Module_ID)

所以你的陈述是:

WHEN matched and convert(varchar(max), TARGET.Module_ID) <> convert(varchar(max), SOURCE.Module_ID)    
THEN 
UPDATE SET TARGET.Module_ID=SOURCE.Module_ID 

还有一句warning

重要! ntext、text 和 image 数据类型将在 SQL Server 的未来版本。避免在 new 中使用这些数据类型 开发工作,并计划修改当前使用的应用程序 他们。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

【讨论】:

  • 当我在做 convert(varchar(max),TARGET.Module_ID) = convert(varchar(max),SOURCE.Module_ID) 它仍然给我一个错误
  • 您可以编辑您的问题以包含您的完整代码吗?
  • 你回答不等于 '' 只适用于等于 '=' 它不起作用
  • 所以?它解决了你的问题吗?据我从您的代码片段中可以看出,在这种情况下,相等运算符没有多大意义。
  • 如果您首先检查合并的语法,我们必须检查它是否不相等,然后我们必须更新。因此,您的转换查询不适用于更新
【解决方案2】:

另一种选择是使用 CAST 函数。

when matched and CAST(TARGET.Module_ID AS VARCHAR(MAX)) <> CAST(SOURCE.Module_ID AS VARCHAR(MAX))

您可以从这里阅读更多信息 - https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2020-12-18
    • 2013-12-04
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多