web-dev-qa-db-ja.com

SQL Server:メッセージ102、レベル15、状態1、行2 '='の近くの不正な構文

ストアドプロシージャを作成していて、テーブル名をパラメーターとして渡していますが、この部分でエラーが発生しています。

DECLARE 
@TableA nvarchar(255)='TableA',
@DOCID1 nvarchar(MAX),
@DOCID2 int;

EXEC ('
SELECT TOP (1) '+ @DOCID1 +'=DOCID1,'+ @DOCID2 +'=DOCID2
FROM [' + @TABLEA + ']
ORDER BY DOCID2')

このクエリを実行すると、次のエラーが発生します。

メッセージ102、レベル15、状態1、行2
「=」付近の構文が正しくありません

私は試しましたが、エラーを特定することができません。この時点で、いくつかの助けが必要です。

5
RicEspn

SQLステートメントを実行する前に、SQLステートメント全体を連結する必要があると思います。

DECLARE 
    @TableA nvarchar(255)='TableA',
    @DOCID1 nvarchar(MAX),
    @SqlStmt NVARCHAR(500),
    @DOCID2 int;

SET @SqlStmt = N'SELECT TOP (1) ' + @DOCID1 + N' = DOCID1, ' + @DOCID2 + N' = DOCID2 FROM [' + @TABLEA + N'] ORDER BY DOCID2';

EXEC (@SqlStmt)

私が思い出す限り、EXECコマンド内に式と計算を含めることはできません。事前にステートメントを準備してから実行してください

また、私はあなたのそれらの変数が何を保持しているのか完全にはわかりません-@DocID1@DocID2-値を設定しますか、それとも設定する別の変数の名前を保持しますか?

pdate:@DocID1@DocID2の値を実際に設定したい場合、クエリの開始点が間違っていました-次のようなものが必要です:

DECLARE 
    @TableA nvarchar(255) = 'TableA',
    @SqlStmt NVARCHAR(500);

SET @SqlStmt = 
    N'DECLARE @DocID1 NVARCHAR(MAX), @DocID2 INT; ' +
    N'SELECT TOP (1) @DOCID1 = DOCID1, @DOCID2 = DOCID2 FROM [' + @TABLEA + N'] ORDER BY DOCID2';

EXEC (@SqlStmt)

ただし、これらの2つの変数のスコープはinside動的に実行されるSQLであり、スクリプトの「外部」では使用できません。

2
marc_s

SQL Serverのバージョンは何ですか?構文-

DECLARE 
@TableA nvarchar(255)='TableA'

sQL Server 2008からのみサポートされています。古いバージョンの場合は、次のように記述する必要があります。

DECLARE 
@TableA nvarchar(255)
SET @TableA ='TableA'
1
Raj