5

ステートメントが生成される CTE がありSELECTますが、SQL Server (2012) では呼び出しが許可されていませんEXEC。クエリは次のとおりです。

DECLARE @guidToFind uniqueidentifier = 'E4069560-091A-4026-B519-104F1C7693B3';

WITH GuidCols (TableName, ColName, Query) As
(
    SELECT  
        C.TABLE_NAME, 
        C.COLUMN_NAME, 
        'SELECT ' + 
             QUOTENAME(C.TABLE_NAME) + '.' + 
             QUOTENAME(C.COLUMN_NAME) + ' 
        FROM ' + 
             QUOTENAME(C.TABLE_NAME) + ' 
        WHERE ' + 
           QUOTENAME(C.COLUMN_NAME) + ' = ''' + cast(@guidToFind AS VARCHAR(50))+
           ''''
    FROM 
        INFORMATION_SCHEMA.COLUMNS C 
        INNER JOIN INFORMATION_SCHEMA.TABLES T 
        ON C.TABLE_NAME = T.TABLE_NAME AND 
           T.TABLE_TYPE = 'BASE TABLE'
    WHERE 
        C.DATA_TYPE = 'uniqueidentifier'
)
-- SELECT * FROM
EXEC( GuidCols.Query )

SELECTCTE の後のステートメントのコメントを外しても、問題は解決しません。

このクエリの目的は、データベース内の GUID のすべてのインスタンスを見つけることです。現在、このようなスクリプトを使用してこの問題を解決しています。ただし、セット操作やその他の手法を使用して、行を反復処理せずにこの問題を解決できれば幸いです。

4

4 に答える 4

5

execの一部として使用することはできませんCTE

WITH common_table_expression (Transact-SQL)から

CTE の後には、一部またはすべての CTE 列を参照する単一の SELECT、INSERT、UPDATE、または DELETE ステートメントが続く必要があります。

代わりにできることは、クエリの結果を一時テーブルに格納し、行をループして、一度に 1 つのステートメントを実行することです。

于 2012-07-26T12:14:33.270 に答える
1

EXEC()関数はT-SQLから使用できますが、SQLステートメント内からはアクセスできません。SQLはいくつかのステップで実行されるため、これが当てはまると思います...次のようなものです。

  1. ステートメントが解析されます。
  2. 実行計画が生成されます。
  3. 実行プランがデータベースに対して実行され、結果が返されます。

EXEC()関数はステートメントを動的に実行するように設計されているため、SQL Serverは、要求されていることを実行するために、最初の2つの手順を実行する必要があります。次に、ステートメントの実行中に、最初の手順に戻る必要があります。動的ステートメントを解析/実行する手順。これは、結果の行ごとに繰り返す必要があります。

このタイプの「機能」は、dbエンジンのパフォーマンスと複雑さに悪影響を与える可能性があるため、利用できないと思います。したがって、最初のステートメントを実行するのは私たちに任せてから、各レコードをループして動的ステートメントを個別に実行します。

于 2012-07-26T03:11:07.163 に答える
1

Exec は、かっこ内に埋め込まれた T-SQL コマンドを実行します。違いは、前のコードで見たように、EXEC() 関数は文字列または文字列変数を実行できることです。EXEC() の引数はリテラル文字列にすることができますが、変数を使用すると、EXEC() の真の力が明らかになります。

変数に含まれるコマンドを実行しますが、関数を呼び出すセッションとは異なるコンテキストで実行します。いくつかの厳しい制約が導入されるため、これは重要です。作成したテーブルはすべて、EXEC() コンテキストから見えますが、呼び出し元のセッションによって宣言された変数は、EXEC() コンテキストから見えません。その逆も同様です。

これに関連する興味深い記事をhttp://msdn.microsoft.com/en-us/library/aa175921(v=sql.80).aspxで見つけました。

上記は自給自足ですが、http: //blog.sqlauthority.com/2007/09/13/sql-server-difference-between-exec-and-execute-vs-exec-use-execute- for-sp-always/

于 2012-07-26T03:21:36.080 に答える