微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 = '11111') 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

原文地址:https://www.jb51.cc/mssql/77224.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐