Sql server 如何使用另一个表中的记录作为列名来创建SQL表变量
我使用以下SQL创建表:Sql server 如何使用另一个表中的记录作为列名来创建SQL表变量,sql-server,tsql,stored-procedures,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]
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-期间1]
到[2016-期间4]
列,我希望根据传递到存储过程中的以逗号分隔的期间ID列表生成这些列
PeriodID
s链接到包含ID
和PeriodName
的Period
表
我考虑只使用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
存储从时段创建的下一列。然后我把桌子吃完。你要找的是一张桌子。您可以选择HotelId
和HotelName
(或任意键)并以PeriodID
为轴心,如果您想从另一个表中的值创建一个新表,那么您可以使用动态SQL,使用字段名作为变量来实现这一点,并使用sp_executesql存储过程构建要执行的字符串。是否可以从SELECT
语句中检索PeriodsID
s?如果是这样的话,请使用前面的方法,然后如何使用该方法创建表变量?@Rick链接中有一个教程。它将使用PeriodID中的每个不同值创建一列。