我已经有了以下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列表生成这些列。
PeriodID
个Period
表格的链接,其中包含ID
和PeriodName
。
我考虑过仅使用HotelId
和HotelName
创建表,然后循环遍历句点并使用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
存储根据需要从句点创建的下一列。然后我完成了桌子。
答案 0 :(得分:1)
如果要根据另一个表中的值创建新表,则可以使用动态SQL使用字段名称作为变量来执行此操作,并使用sp_executesql存储过程构建要执行的字符串。
答案 1 :(得分:0)
您要找的是pivot table。您可以在HotelId
上选择HotelName
和PeriodID
(或任何您的密钥)和PIVOT。