0

我正在尝试做一个动态 sql 查询,类似于这个论坛上出现的一些查询,但是对于我的生活,我无法让它工作。

我正在使用 SQL Server 2008。我有一个包含一系列 order_ref 编号的表。这些数字中的每一个都有与其相关联的不同数量的advice_refs。advice_ref 编号是唯一的(它们是来自另一个表的键)。每个order_ref 至少有一个advice_ref。有一堆列描述了每个advice_ref 的信息。

我想要做的是创建一个表,其中每个唯一的 order_ref 有一行,每个advice_ref 的列按升序排列。列将是 Advice01、Advice02、....Advice10、Advice11 等。并非所有 Advice# 列都会为每个 order_ref 填写,advice# 列的数量取决于具有最大数量的advice_refs 的 order_ref。

该表如下所示:

Order Advice01  Advice02  Advice03  Advice04.....
  1       1         2         3        
  2       5         8         9        20
  3       25

我尝试使用的代码是:

    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @PVT NVARCHAR(MAX)

    SELECT  @SQL = @SQL + ', COALESCE(' + QUOTENAME('Advice' + RowNum) + ', '''') AS ' +  QUOTENAME('Advice' + RowNum),
            @PVT = @PVT + ', ' + QUOTENAME('Advice' + RowNum)
    FROM    (SELECT case when RowNum2 < 10 then '0'+RowNum2 when RowNum2 >=10 then RowNum2 end [RowNum] From
    (   SELECT  DISTINCT CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref)) [RowNum2]
                FROM    [ED_dups].[dbo].[NewEDDupsLongForm]
            ) rn2 ) rn

    SET @SQL = 'SELECT order_ref' + @SQL + '
                FROM    (   SELECT  order_ref, 
                                    advice_ref, 
                                    case when CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref)) < 10 
                                         then ''Advice0'' + CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref))
                                         else ''Advice'' + CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref)) 
                                         end [AdviceID]
                            FROM    [ED_dups].[dbo].[NewEDDupsLongForm]
                        ) data
                        PIVOT
                        (   MAX(advice_ref)
                            FOR AdviceID IN (' + STUFF(@PVT, 1, 2, '') + ')
                        ) pvt'

    EXECUTE SP_EXECUTESQL @SQL

SQL 服务器告诉我查询执行成功,但没有输出。当我运行代码片段时,似乎问题在于靠近的枢轴语句 + STUFF(@PVT, 1, 2, '') + ') 和/或靠近的选择语句 ''Advice0'' +

提前感谢您的帮助——我已经在这几天了!

4

2 回答 2

2

我认为您必须初始化变量,例如

DECLARE @SQL NVARCHAR(MAX) = ''
DECLARE @PVT NVARCHAR(MAX) = ''

或者

DECLARE @SQL NVARCHAR(MAX)
DECLARE @PVT NVARCHAR(MAX)

SELECT @SQL = '', @PVT = ''

否则你@SQL会为空

于 2013-09-24T16:40:36.410 回答
0

我想到的第一件事是——你真的需要 SQL 来获取具有动态列数的数据集吗?如果您正在编写应用程序,那么您的用户界面,无论是网页还是桌面应用程序表单,都可以更好地将数据转换为所需的结构。

如果您确实需要这样做,那么您将不会尝试在一个大而复杂的查询中完成所有事情,而是将其分解为逐步完成的较小任务,这样您的生活就会变得更加轻松。我要做的是使用临时表来存储工作结果,然后在将我的数据插入到一个或多个临时表中时,使用游标来处理顺序和建议,最后返回这个表的内容。将所有内容包装在存储过程中。这种方法还可以让您更轻松地调试它——您可以检查每一步是否完成了预期的工作。

最后的建议 - 分享你的 NewEDDupsLongForm 表的定义 - 有人可能会写一些代码来帮助你。

干杯

于 2013-09-24T16:42:49.393 回答