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

标签 sql-server t-sql 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 列表生成这些列被传递到存储过程中。

PeriodID 链接到包含 IDPeriodNamePeriod 表。

我考虑过创建仅包含 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 来存储根据需要从周期创建的下一个列。然后我完成 table 。

最佳答案

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

关于sql-server - 如何使用另一个表中的记录作为列名创建 SQL 表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661045/

相关文章:

mysql - 如何获取存储过程结果以用于另一个存储过程或查询语句

c# - 存储过程默认值

sql - SQL "DELETE"语句后跟 "WHERE NOT IN"语句可以在同一个事务中吗?

sql - 动态 SQL 中无效的伪列错误

sql - 数据库表中的键/值对

sql - 从 SQL Server 中多个数据库的表中选择一个字段

SQL 使用 IF 条件的列值

c# - SQL Server 中的 CLR 存储过程的性能

sql - TSQL 多列索引

sql - 选择与 MAX 列值对应的列值