2

次のストアド プロシージャでエラーが発生し続けます。EXEC を使用して正しく動作させた後、sp_executesql に切り替えましたが、実行できませんでした。次のエラーが発生し続けます: '@numberOfItems' 付近の構文が正しくありません。

ALTER PROCEDURE dbo.FetchResourcesToProcess
(
@tableName nvarchar(MAX),
@numberOfItems int
)
AS
    BEGIN
        DECLARE @SQL nvarchar(MAX);
        SET NOCOUNT ON;
        SET @SQL = N'Select TOP @numberOfItems * from ' + @tableName + N' where Active = 1 AND BeingProcessed = 0'
        EXEC sp_executesql @SQL, N'@numberOfItems int', @numberOfItems
    END

テーブル名は、"[TABLENAME]" のような構造の文字列です。

ありがとう

4

2 に答える 2

4

テーブル名 SET @SQL = N'Select TOP ' + Convert(varchar(10),@numberOfItems) + ' * from ' + @tableName + N' と同じように、おそらく文字列に項目数を配置する必要があります。ここで、アクティブ = 1 AND 処理中 = 0'

于 2012-07-17T23:07:14.910 に答える
0

sp_executesql ステートメントのパラメーターは、変数が許可されている位置でのみ使用できると思います。

use master;
declare @numberOfItems  int;
set @numberOfItems  =   2;
Select TOP @numberOfItems * from dbo.spt_values

「@numberOfItems」付近の構文が正しくありません。

use master;
declare @table  varchar(max);
set @table  =   'dbo.spt_values';
Select * from @table

テーブル変数「@table」を宣言する必要があります。

use master;
declare @numberOfItems  int;
set @numberOfItems  =   2;
Select TOP(@numberOfItems) * from dbo.spt_values

(影響を受ける 2 行)

解決策 1 (括弧、推奨):

        SET @SQL = N'Select TOP(@numberOfItems) * from ' + @tableName + N' where Active = 1 AND BeingProcessed = 0'

解決策 2 (連結、SQL インジェクションを防ぐようにしてください!):

        SET @SQL = N'Select TOP '+cast(@numberOfItems as nvarchar(MAX))+' * from ' + @tableName + N' where Active = 1 AND BeingProcessed = 0'
        EXEC sp_executesql @SQL
于 2016-11-18T11:47:02.470 に答える