このストアドプロシージャ
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
ステートメントがストアドプロシージャ内で異なる動作をする理由を誰かが知っていますか?