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"。我已宣布了价值而不确定原因是什么。
任何帮助将不胜感激。
答案 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