dut*_*lab 7 sql-server coldfusion pivot
我有一个查询返回的字符串,其中包含:
+----------------------+
| returnquerystring |
+----------------------+
| exam1,exam2,exam3 |
+----------------------+
Run Code Online (Sandbox Code Playgroud)
我将此返回的字符串用作数据透视查询中的列名.
select * from (select score,exam from table1) x
pivot ( max(score) for exam in (exam1,exam2,exam3)
Run Code Online (Sandbox Code Playgroud)
这个查询有效
+-------------+-----------+-----------+
| exam1 | exam2 | exam3 |
+-------------+-----------+-----------+
| 10 | 20 | 30 |
+-------------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)
但是,除了exam1,exam2,exam3的硬编码值之外,我还没有能够使用"in"语句来使用任何东西.例如,我使用了SSMS并创建了一个成功将exam1,exam2,exam3放入@ var1的查询.但是,当用来代替exam1,exam2,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'.
Run Code Online (Sandbox Code Playgroud)
为了验证我做得对,我做了这个并且它有效.
declare @var1 int
select top 1 @var1 = id from name
select * from name where id = @var1
Run Code Online (Sandbox Code Playgroud)
这为名称表上的id 1提供了数据行,没有错误.
我在实验中注意到(考试1,考试2,考试3)不能用引号括起来('exam1,exam2,exam3').
我正在使用ColdFusion CFSCRIPT,看起来单引号进入查询,所以我尝试使用ColdFusion函数进行各种测试以删除它们但没有成功.
所以我尝试在@ var1周围使用SQL Server函数'replace',并在replace时抛出有关语法的错误.
这是当我尝试在SSMS中使用上述示例时仍然出现错误.因此,通过从等式中删除ColdFusion,它仍然不起作用.我的想法是通过pivot发送整个声明作为查询以避免ColdFusion问题,但它在SSMS中不起作用.
我正在使用SQL SERVER 8和SSMS 11.
关于如何使这项工作的任何想法?
examColumns = exam1,exam2,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 = '11111') x
pivot
(
max(score) for exam in (:columnNames)
) p
");
returnqry = result.getResult();
return returnqry;
}
Run Code Online (Sandbox Code Playgroud)
您需要使用Dynamic SQL
来使用变量(@ var1)的值Pivot
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
Run Code Online (Sandbox Code Playgroud)
如果要在枢轴列中包含多个值,请使用此值。
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
Run Code Online (Sandbox Code Playgroud)