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'其中 Active = 1 AND BeingProcessed = 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 回答