如何使用另一个表中的记录作为列名创建SQL表变量

时间:2016-06-06 15:18:18

标签: sql-server tsql stored-procedures

我已经有了以下SQL来创建表:

declare @FirstColumnSPResultTable       table
(
    [HotelId]               int,
    [HotelName]             nvarchar(256),
    [2016 - Period 1]       decimal(10,1),
    [2016 - Period 2]       decimal(10,1),
    [2016 - Period 3]       decimal(10,1),
    [2016 - Period 4]       decimal(10,1),
    [Overall]               decimal(10,1),
    [#Jobs]                 int,
    [Rank]                  int,
    [OverallRow]            bit
)

如果我有[2016 - Period 1][2016 - Period 4]列,我希望根据以逗号分隔的传递到存储过程的期间ID列表生成这些列。

PeriodIDPeriod表格的链接,其中包含IDPeriodName

我考虑过仅使用HotelIdHotelName创建表,然后循环遍历句点并使用WHILE循环和ALTER TABLE语句创建每个列,以某种方式使用在SELECT语句中检索它的名称,然后将最后4列添加到表中。

我认为可以这样做,但有人能告诉我一个更好的方法吗?

编辑: 使用@ADyson建议的动态sql的完整解决方案:

DECLARE @Sql    nvarchar(max) = '

DECLARE @FirstColumnSPResultTable       table           ([HotelId]              int,
                                                         [HotelName]            nvarchar(256),'

DECLARE @FirstPeriodIdCommaDelimListAsColumns   nvarchar(max)
SET @FirstPeriodIdCommaDelimListAsColumns = STUFF
        (
            (
                SELECT      ',' + QUOTENAME(p.[PeriodName]) + ' decimal(10,1) '
                FROM        [dbo].[Period] p WITH(NOLOCK)
                WHERE p.PeriodId IN (SELECT Value FROM dbo.fn_Split(',', @FirstPeriodIdCommaDelimListInt))
                ORDER BY p.[Year], p.[PeriodName]
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,''
        ) + ','

SET @Sql = @Sql + @FirstPeriodIdCommaDelimListAsColumns + '
                                                         [Overall]              decimal(10,1),
                                                         [#Jobs]                int,
                                                         [Rank]                 int,
                                                         [OverallRow]           bit)'

所以我创建表的第一部分,然后使用FirstPeriodIdCommaDelimListAsColumns存储根据需要从句点创建的下一列。然后我完成了桌子。

2 个答案:

答案 0 :(得分:1)

如果要根据另一个表中的值创建新表,则可以使用动态SQL使用字段名称作为变量来执行此操作,并使用sp_executesql存储过程构建要执行的字符串。

答案 1 :(得分:0)

您要找的是pivot table。您可以在HotelId上选择HotelNamePeriodID(或任何您的密钥)和PIVOT。