Pet*_*one 2 t-sql sql-server stored-procedures exec
这个存储过程
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;
Run Code Online (Sandbox Code Playgroud)
传递时SELECT * FROM ASSET生成此SQL
select *, ROW_NUMBER() over (order by ONE) R INTO #FOO
FROM (select * ,1 ONE from asset) T
Run Code Online (Sandbox Code Playgroud)
当我从SQL Server Management Studio执行此操作时,如下所示:
exec('select *, ROW_NUMBER() over (order by ONE) R INTO #FOO FROM (select * ,1 ONE from asset) T')
Run Code Online (Sandbox Code Playgroud)
它按预期创建表#FOO.
但是,执行存储过程时:
exec getpage 5,10,'select * from asset'
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
Msg 2812,Level 16,State 62,Procedure GetPage,Line 12
找不到存储过程'select*,ROW_NUMBER()over(order by ONE)R INTO FOO FROM(select*,1 ONE from asset)T'.
消息208,级别16,状态1,过程GetPage,第14行
无效的对象名称'#FOO'.
我认为第二个消息仅仅是第一个错误的结果.有谁知道为什么exec语句在存储过程中表现不同?
在你的exec中使用括号
EXEC (@SQL);
Run Code Online (Sandbox Code Playgroud)
没有括号,你使用这个:
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH [ ,...n ] ]
}
[;]
您需要在需要括号的地方.
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[;]