【问题标题】:DynamicSQL using sp_executesql ErrorDynamicSQL 使用 sp_executesql 错误
【发布时间】:2012-07-16 22:31:33
【问题描述】:

我不断收到以下存储过程的错误。我使用 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]”。

谢谢

【问题讨论】:

  • 选择@SQL。获取结果并将其复制并粘贴到 SSMS 中,看看是否可以执行。您将获得更好的错误消息。
  • 你需要在@numberOfItems周围加上括号:N'Select TOP (@numberOfItems) * from '

标签: sql sql-server-2008 stored-procedures dynamic-sql sp-executesql


【解决方案1】:

我认为你只能在允许变量的位置使用 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'

方案二(串联,一定要防止SQL注入!):

        SET @SQL = N'Select TOP '+cast(@numberOfItems as nvarchar(MAX))+' * from ' + @tableName + N' where Active = 1 AND BeingProcessed = 0'
        EXEC sp_executesql @SQL

【讨论】:

    【解决方案2】:

    您可能需要以与表名相同的方式将项目数放入字符串中 SET @SQL = N'Select TOP ' + Convert(varchar(10),@numberOfItems) + ' * from ' + @tableName + N' 其中 Active = 1 AND BeingProcessed = 0'

    【讨论】:

      猜你喜欢
      • 2012-06-17
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多