【问题标题】:Dynamic UPDATE statement动态更新语句
【发布时间】:2012-05-24 14:29:26
【问题描述】:

我想创建一个动态更新查询,我需要在列中设置某个值。但是需要从另一个表中选择列名。 我已经有以下查询:

UPDATE core.TableRes
SET (
    SELECT Code FROM core.TableFields 
    INNER JOIN core.TableXTableFields ON TableXTableFields.FieldID = TableFields.FieldID 
    INNER JOIN core.TableResRefLinks ON TableResRefLinks.ExtraFieldID = TableXTableFields.ExtraFieldID 
    WHERE TableResRefLinks.TableResRefLinksID = RefLinks.TableResRefLinksID)
= (
    SELECT Value FROM core.TableResRefLinks WHERE TableResRefLinksID = RefLinks.TableResRefLinksID)
FROM core.TableRes
    INNER JOIN core.TableResRefLinks RefLinks ON RefLinks.ResourceID = TableRes.ResourceID
    INNER JOIN core.TableXTableFields ON TableXTableFields.ExtraFieldID = RefLinks.ExtraFieldID
    INNER JOIN core.TableFields ON TableFields.FieldID = TableXTableFields.FieldID
    WHERE (EndDate IS NULL OR EndDate > GETDATE()) AND
    (
        SELECT Code FROM core.TableFields 
        INNER JOIN core.TableXTableFields ON TableXTableFields.FieldID = TableFields.FieldID 
        INNER JOIN core.TableResRefLinks ON TableResRefLinks.ExtraFieldID = TableXTableFields.ExtraFieldID 
        WHERE TableResRefLinks.TableResRefLinksID = RefLinks.TableResRefLinksID) 
    <>
    (
        SELECT Value FROM core.TableResRefLinks 
        WHERE TableResRefLinksID = RefLinks.TableResRefLinksID)

它给了我以下错误:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '('.
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '='.
Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'FROM'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near '<'.

有没有办法解决这个问题?如果我更改完整的 UPDATE 和 SET 语句并用 SELECT * 替换它们,我会得到结果。

编辑
以下是数据类型
TableFields.Code => nvarchar(100)
TableResRefLinks.Value => sql_variant
并且列名称为 TableFields.Code 的列的数据类型设置为 sql_variant

【问题讨论】:

  • AFAIK 您无法通过选择查询动态确定要更新的字段。此外,您无法使用这样的 select 语句检索其值,因为您最终可能会遇到这样一种情况:查询会尝试使用从 select 返回的多个值填充一个字段。
  • 好的,谢谢您的澄清。我在创建 UPDATE 查询的地方创建了一个 SELECT,然后我可以轻松地运行所有这些查询。

标签: sql sql-update inner-join


【解决方案1】:

您无法使用纯 SQL 解决此问题。您需要某种脚本来构建您的语句。例如,postgresql 有一种称为“pgpsql”的脚本语言,它允许构建动态 SQL 语句。但这显然取决于底层的 RDBMS。

顺便说一句:这适用于 SELECT,因为您正在执行简单的子选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2011-04-25
    • 2010-09-13
    • 2021-11-23
    相关资源
    最近更新 更多