我有以下 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
链接到包含 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
来存储根据需要从周期创建的下一个列。然后我完成 table 。
最佳答案
如果您想根据另一个表中的值创建一个新表,则可以使用动态 SQL 来执行此操作,使用字段名称作为变量,并构建一个字符串以使用 sp_executesql 存储过程执行。
关于sql-server - 如何使用另一个表中的记录作为列名创建 SQL 表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661045/