从Select中创建表,将行作为列

时间:2014-04-21 04:56:23

标签: sql sql-server

我需要根据我的参数创建一个包含列的表。参数是字符串变量,它由逗号分隔的多个值的月份和年份组合组成。根据这个值,我需要创建临时表。我尝试过如下

DECLARE @compareMonths VARCHAR(2000)
DECLARE @compareCount INT
DECLARE @cols VARCHAR(2000)
DECLARE @query AS NVARCHAR(MAX);

SET @compareMonths = '2014-01,2014-02'

select @cols =  STUFF((SELECT distinct ',' +
 CONVERT(CHAR(3), DATENAME(MONTH, CAST(
      CAST(SUBSTRING(Data, 0, 5) AS VARCHAR(4)) +
      RIGHT('0' + CAST(SUBSTRING(Data, 6, 2) AS VARCHAR(2)), 2) +
      RIGHT('0' + CAST(1 AS VARCHAR(2)), 2) 
   AS DATETIME))) + ' ' + CAST(SUBSTRING(Data, 0, 5) AS VARCHAR(4))
                      FROM dbo.Split(@compareMonths, ',')
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

这里我将列名称作为月份名称和年份,但是如何基于此动态创建表格。我没有任何值列来使用pivot。

我的outout表必须有2列,分别为2014年1月,2014年2月

1 个答案:

答案 0 :(得分:0)

如果你想要一个SQL数据库表,你可以build Dynamic SQL script形成一个CREATE TABLE脚本,如下所示

DECLARE @compareMonths VARCHAR(2000)
SET @compareMonths = '2014-01,2014-02'

declare @sql nvarchar(max) 

SELECT @sql = isnull(@sql + ',','') + ( '[' + val + ']') + ' varchar(100)' from dbo.Split(@compareMonths, ',')

SET @sql = N'CREATE Table OutputTable (' + @sql + ')'
exec sp_executeSql @sql

select * from OutputTable

在上面的脚本中,我还使用了sql string split function,您可以在参考教程中找到源代码

最后,您将在数据库中有一个名为OutputTable的表,其中包含两列