3

このストアドプロシージャ

CREATE PROC GetPage(@blockNumber int, @blockSize int = 40, @query varchar(1000)) 
AS
   DECLARE @a int = @blockNumber * @blockSize;
   DECLARE @b int = @a + @blockSize - 1;
   DECLARE @fromPos int = PATINDEX('% FROM %', @query);
   DECLARE @from varchar(1000) = SUBSTRING(@query, @fromPos, 1000);
   DECLARE @select varchar(1000) = SUBSTRING(@query, 1, @fromPos);
   DECLARE @SQL varchar(1000) = 
      'select *, ROW_NUMBER() over (order by ONE) R INTO #FOO FROM ('
      +@SELECT+',1 ONE'+@from+') T';

   EXEC @SQL;

   SELECT * FROM FOO WHERE RN BETWEEN @a AND @b;

   DECLARE @C INT = (SELECT COUNT(*) FROM #FOO);
   DROP TABLE #FOO
   RETURN @C;

渡されるとSELECT * FROM ASSET、このSQLが生成されます

select *, ROW_NUMBER() over (order by ONE) R INTO #FOO 
FROM (select * ,1 ONE from asset) T

これをSQLServerManagement Studioから実行すると、次のようになります。

exec('select *, ROW_NUMBER() over (order by ONE) R INTO #FOO FROM (select * ,1 ONE from asset) T')

期待どおりにテーブル#FOOが作成されます。

ただし、ストアドプロシージャが実行されると、次のようになります。

exec getpage 5,10,'select * from asset'

このエラーが発生します

メッセージ2812、レベル16、状態62、プロシージャGetPage、行12
ストアドプロシージャが見つかりませんでした'select *、ROW_NUMBER()over(order by ONE)R INTO FOO FROM(select *、1 ONE from Asset)T'。
メッセージ208、レベル16、状態1、プロシージャGetPage、行14
無効なオブジェクト名'#FOO'。

2番目のメッセージは、最初のエラーの結果にすぎないと思います。execステートメントがストアドプロシージャ内で異なる動作をする理由を誰かが知っていますか?

4

1 に答える 1

7

execで括弧を使用する

EXEC (@SQL); 

EXECUTE(Transact-SQL)

括弧なしでこれを使用しています:

ストアドプロシージャまたは関数を実行します
[{EXEC | 実行する } ]
    {{
      [@return_status =]
      {module_name [; number] | @module_name_var }
        [[@parameter=]{値
                           | @variable [OUTPUT]
                           | [ デフォルト ]
                           }
        ]
      [、... n]
      [WITH [、... n]]
    }
[;]

括弧が必要な場合はこれが必要です。

文字列を実行する
{EXEC | 実行する }
    ({ @string_variable | [N]'tsql_string'} [+ ... n])
    [AS{ログイン| USER}='名前']
[;]
于 2013-03-27T07:29:03.920 に答える