为什么它会给我"必须声明标量变量" @ jobnumber" "

时间:2017-05-02 16:26:09

标签: sql sql-server tsql stored-procedures dynamic

    DECLARE @sql VARCHAR(8000)
    ,@jobNumber VARCHAR(25)
    ,@DBName VARCHAR(30)

    SET @jobNumber = '417133'

    DROP TABLE #Actual

    CREATE TABLE #Actual (
    jobnumber INT
    ,firstNameCounts VARCHAR(25)
    ,lastNameCounts VARCHAR(25)
    ,address1Counts VARCHAR(25)
    ,address2Counts VARCHAR(25)
    ,cityCounts VARCHAR(25)
    ,stateCounts VARCHAR(25)
    ,zipCounts VARCHAR(25)
    ,inHomeDateCounts VARCHAR(25)
    )

    SET @sql = 'INSERT INTO #actual (jobnumber,firstNameCounts,lastNameCounts , 
   address1Counts, address2Counts, cityCounts, stateCounts, zipCounts, 
   inHomeDateCounts) '
   SET @sql = @sql + ' Select s.jobnumber, count(s.firstName) AS 
   [firstNameCounts], Count (s.lastName) AS [lastNameCounts], Count (s.Address1) 
   As [address1Counts], Count (s.address2)-Count (address2) AS '
   SET @sql = @sql + ' [address2Counts], Count (s.City) AS [cityCounts], Count 
   (s.State) AS [stateCounts], Count (s.Zip) AS [zipCounts], Count 
   (jb.inHomeDate) AS [inHomeDateCounts] '
   SET @sql = @sql + ' From [s-portaldb1].[tdis_417133) + ].[dbo].
   [tblStandardFinal] s '
   SET @sql = @sql + ' INNER JOIN [s-printstream].[tdSchedule2].[dbo].
   [tblJobTicketActions] jb '
   SET @sql = @sql + ' ON jb.psFlagJobNumber = s.jobNumber '
   *SET @sql = @sql + ' where jobNumber = @jobNumber '* Getting error here 
   SET @sql = @sql + ' group by jobNumber '

   PRINT @SQL

   EXEC (@sql)

   SELECT *
   FROM #Actual

我收到了这个

错误:消息137,级别15,状态2,行1 必须声明标量变量" @ jobNumber"。我已宣布了价值而不确定原因是什么。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

因为您正在使用exec()执行SQL,并且没有在执行的sql中为该变量提供声明。 @sql将在其自己的上下文中执行,并且将无法访问在已执行的sql之外声明的同名变量。

您可以改为使用允许参数声明和参数传递的sp_executesql

declare @sql nvarchar(max); /* nvarchar() instead of varchar() */
... 

exec sp_executesql @sql, N'@JobNumber Varchar(25)', @JobNumber;

动态sql参考:

答案 1 :(得分:0)

您正在运行动态SQL - 它在自己的上下文中运行,而对您声明的变量没有访问权限

使用传入的值(在稍后执行的SQL字符串中)构造动态SQL,或者在没有动态SQL的情况下弄清楚如何执行此操作(我没有看到构建字符串的原因和{{ 1}} uting it)。

所有字符串连接似乎都是多余的。

所以不要这样:

const token = this.authenticationService.getToken();

let headers = new Headers({
  'Content-Type': 'application/json',
  'Authorization': `Bearer ${token}`
});

你应该只有:

EXEC