【发布时间】:2015-09-02 17:01:01
【问题描述】:
我尝试使用临时表来开发这个存储过程,但这不起作用,所以我转而使用表变量。我需要对表变量执行临时动态查询,然后使用该表变量执行最终查询。问题是我收到一个错误“必须声明标量变量@clms”。我假设 Exec 没有表变量的范围?
DECLARE @qry nvarchar(4000)
DECLARE @clms TABLE (mastcatname nvarchar(50),engdtlbeta decimal (18,4))
SET @qry='INSERT INTO @clms
SELECT distinct replace(mastcatname, '' '', '''') as mastcatname,
engdtlbeta
FROM vw_Scorecard
WHERE empsurveyid=' + cAST(@EmpSurveyID AS nvarchar(10)) + '
AND UnitID IN (' + @UnitIDs + ')
ORDER BY engdtlbeta desc, MastCatName'
EXEC(@qry)
DECLARE @cols nvarchar(1000)
SELECT @cols=COALESCE (@cols + ',[' + mastcatname + ']', '[' + mastcatname + ']')
FROM @clms
SET @qry='SELECT UnitName ,
ParentName, ' + @cols + '
FROM (
SELECT UnitName,
ParentName,
ScoreAvg,
replace(mastcatname, '' '','''') as mastcatname
FROM vw_Scorecard
WHERE UnitID IN (' + @UnitIDs + ')
AND EmpSurveyID=' + cast(@EmpSurveyID as nvarchar(5)) + ' ) p
PIVOT
(SUM(ScoreAvg) FOR mastcatname in (' + @cols + ')) as pvt'
EXEC (@qry)
【问题讨论】:
-
请不要使用字符串连接来为您的动态查询添加参数。使用带参数的
sp_executesql -
你的假设是正确的。为什么临时表不起作用?
-
@UnitIDs来自哪里?你能把这些值放到另一个表变量中吗?那么第一个查询就不需要动态 SQL。
标签: sql sql-server-2008