Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用另一个表中的记录作为列名来创建SQL表变量_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server 如何使用另一个表中的记录作为列名来创建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]

我使用以下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-期间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中的每个不同值创建一列。