-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 * に置き換えると、結果が得られます。

編集
ここにデータ型があり
ます TableFields.Code => nvarchar(100)
TableResRefLinks.Value => sql_variant
そして、列名として TableFields.Code を持つ列のデータ型は sql_variant として設定されます

4

1 に答える 1

2

プレーン SQL を使用してこれを解決することはできません。ステートメントを作成するには、何らかのスクリプトが必要です。たとえば、postgresql には「pgpsql」と呼ばれるスクリプト言語があり、動的 SQL ステートメントを作成できます。しかし、これは明らかに基盤となる RDBMS に依存します。

ちなみに、単純なサブセレクトを行っているので、これは SELECT で機能します。

于 2012-05-24T14:33:20.440 に答える