2012-05-24 39 views
-1

我想创建一个动态更新查询,我需要在列中设置一个特定的值。但是列名需要从另一个表中选择。 我已经下面的查询:动态更新语句

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 *,我会得到结果。

EDIT
下面是数据类型
TableFields.Code =>为nvarchar(100)
TableResRefLinks.Value => SQL_VARIANT
以及具有作为列名TableFields.Code的列的数据类型被设定为SQL_VARIANT

+0

AFAIK您无法通过选择查询动态确定要更新的字段。另外,你不能用这样的select语句检索它的值,因为你最终可能会在查询尝试从select中返回多个值的情况下填充一个字段。 –

+0

好的,谢谢你的澄清。我创建了一个SELECT来创建UPDATE查询,然后我可以轻松地运行所有这些查询。 – TimVK

回答

2

你不能用普通的SQL来解决这个问题。你需要一些脚本来建立你的陈述。例如,postgresql有一个名为“pgpsql”的脚本语言,它允许构建动态SQL语句。但是这显然取决于底层的RDBMS。

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