sql-server – 在数据透视查询中使用变量的SQL Server
我有一个查询返回的字符串,其中包含:
+----------------------+ | returnquerystring | +----------------------+ | exam1,exam2,exam3 | +----------------------+ 我将此返回的字符串用作数据透视查询中的列名. select * from (select score,exam from table1) x pivot ( max(score) for exam in (exam1,exam3) 这个查询有效 +-------------+-----------+-----------+ | exam1 | exam2 | exam3 | +-------------+-----------+-----------+ | 10 | 20 | 30 | +-------------+-----------+-----------+ 但是,除了exam1,exam3的硬编码值之外,我还没有能够使用“in”语句来使用任何东西.例如,我使用了SSMS并创建了一个成功将exam1,exam3放入@ var1的查询.但是当用于代替exam1,exam3时,@ var1将抛出并出错. declare @var1 varchar(100) select @var1 = value from table select * from (select score,exam from table1) x pivot ( max(score) for exam in (@var1) Incorrect syntax near '@var1'. 为了验证我是否正确地做了我做了这个并且它有效. declare @var1 int select top 1 @var1 = id from name select * from name where id = @var1 这为名称表上的id 1提供了数据行,没有错误. 我在实验中注意到(考试1,考试2,考试3)不能用引号括起来(‘exam1,exam3’). 我正在使用ColdFusion CFSCRIPT,看起来单引号进入查询,所以我尝试使用ColdFusion函数进行各种测试以删除它们但没有成功. 所以我尝试在@ var1周围使用SQL Server函数’replace’,这会在替换时抛出有关语法的错误. 这是我在SSMS中尝试使用上述示例时仍然出现错误的原因.因此,通过从等式中删除ColdFusion,它仍然不起作用.我的想法是通过pivot发送整个声明作为查询以避免ColdFusion问题,但它在SSMS中不起作用. 我正在使用SQL SERVER 8和SSMS 11. 关于如何使这项工作的任何想法? examColumns = exam1,exam3 public any function qryExamScores(string examColumns) { thisQry = new Query(); thisQry.setName("returnqry"); thisQry.setDatasource(application.datasource); thisQry.addParam(name="columnNames",value=arguments.examColumns,cfsqltype="cf_sql_varchar"); result = thisQry.execute(sql=" select * from (select id,score,exam from table where value1 = 'XXXXX' and value2 = '22222') x pivot ( max(score) for exam in (:columnNames) ) p "); returnqry = result.getResult(); return returnqry; } 解决方法您需要使用动态SQL在数据透视表中使用变量(@ var1)的值declare @var1 varchar(100)='',@sql nvarchar(max) select top 1 @var1 = value from table set @sql = 'select * from (select score,exam from table1) x pivot ( max(score) for exam in (['+@var1+'])) piv' exec sp_executesql @sql 如果要在透视列中有多个值,请使用此值. SELECT @var1 += '[' + Isnull(CONVERT(VARCHAR(50),value),'') + '],' FROM table SELECT @var1 = LEFT(@var1,Len(@var) - 1) SET @sql = 'select * from (select score,exam from table1) x pivot ( max(score) for exam in (' + @var1 + ')) piv' EXEC Sp_executesql @sql (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |