首页 > 解决方案 > 使用 bcp 的动态数据透视 SQL 查询给出“无法解析列级排序规则。BCP 复制失败”错误

问题描述

我正在尝试使用动态 sql 将一列(“问题”)转换为具有 7 列的表中的几列(问题文本)。我要旋转的一列的相应数据位于单个列(“答案”)中,但旋转表中的列将位于新列(问题文本)下。我正在使用 bcp 将查询输出复制到文件中,并且收到错误“无法解析列级排序规则。复制失败。” 我能做些什么来解决这个问题?

我在 SQL Server 代理作业中通过 Powershell 使用 Microsoft Sql Server 17 和 bcp。我已经尝试使用动态 sql 来简单地选择列,而不是旋转表,我得到了同样的错误。 在此处输入图像描述 以上类似于我正在使用的表格。我想将问题列旋转为 4 个单独的列,答案位于问题文本下方。最终表应该有一行,因为 Id 是相同的。

这是将问题列填充到单个列中的代码:

    DECLARE @cols nVARCHAR(MAX), @DynamicPivotQuery nVARCHAR(max); 
set @cols = STUFF((SELECT DISTinct ','+ QUOTENAME(Question) from db.testforpivot FOR XML PATH(''), TYPE).value('.', 'nVARCHAR(MAX)') ,1,1,'') 
select @cols;

给出:

在此处输入图像描述

这是动态枢轴的代码:

SET @DynamicPivotQuery = 'SELECT Id,' + @cols+' ( select Id, name, user, extId, Question, score1 from db.testforpivot ) x pivot ( MAX(Answer)for Question in ('+@cols+')) as pivotResult' 
exec sp_executesql @DynamicPivotQuery

当我运行以下 bcp 命令时,出现上述错误:

bcp "SET QUOTED_IDENTIFIER ON
sql code above here" queryout C:\Users\ssingla\Documents\EvalExportLast24Hrs.txt -c  -t -T

我期待以下内容: 在此处输入图像描述

等,答案旁边有分数

编辑 8/3/19 感谢那些为我指明正确方向的人。以下查询适用于 MSSMS 中的动态数据透视。现有解释中缺少的关键点是由 QUOTENAME 产生的括号 '[' 和 ']' 需要在动态枢轴中替换为空字符串。我将在星期一测试 bcp:

DECLARE @cols nVARCHAR(MAX),
@DynamicPivotQuery nVARCHAR(max);
select @cols = STUFF((SELECT DISTinct ','+ QUOTENAME(Question) from tempdb.dbo.test FOR XML PATH(''), TYPE).value('.', 'nVARCHAR(MAX)'),1,1,'')
select @cols;

SET @DynamicPivotQuery = 
'select *
from 
(
  select *
    from tempdb.dbo.test
) a
pivot
(
  max(Answer)
  for Question in ('+STUFF(REPLACE(REPLACE(@cols,'[', ''),']',''),1,1,'')+')
) p';
exec sp_executesql @DynamicPivotQuery

标签: sqlsql-serverdynamicpivotbcp

解决方案


推荐阅读