如何从动态列表创建临时表

时间:2014-03-11 00:35:16

标签: sql sql-server-2008

我有一个表FieldList(ID int,Title varchar(50)),并希望为FieldList中的每个记录创建一个临时表,其列名为_ FieldList.Title,类型为varchar。

这一切都发生在存储过程中,临时表返回给客户端进行报告和数据分析。

e.g。

FieldList表:

ID标题

1个城市

2 UserSuppliedFieldName

3 SomeField

结果临时表列:

City UserSuppliedFieldName SomeField

3 个答案:

答案 0 :(得分:0)

创建此功能并将所需的列表传递给它。它将暂时为您生成一个表,您可以与任何其他SQL查询实时使用。我也提供了一个例子。

CREATE FUNCTION [dbo].[fnMakeTableFromList]
(@List varchar(MAX), @Delimiter varchar(255))
RETURNS table
AS
RETURN (SELECT Item = CONVERT(VARCHAR, Item)
          FROM   (SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
                  FROM   (SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')) AS a
                         CROSS APPLY [XML].nodes('i') AS x(i)) AS y
          WHERE  Item IS NOT NULL);
GO

你可以像这样使用它......

Parm1 =由分隔符分隔的字符串中的列表 Parm2 =分隔符

SELECT *
FROM fnMakeTableFromList('a,b,c,d,e',',')

结果是一张表...... 一个 b C d ë

答案 1 :(得分:0)

使用先前创建的表“FieldList”,其中包含字段“ID”和“标题”...

第1步:创建表格。字段“First”只有一个字段,我们将在最后删除它

create table #SOE (First varchar(50))

第2步:右键单击并选择“Result To - &gt; Result to text”,然后运行查询:

select 'alter table #SOE add ' + Title + ' varchar(50)' from dbo.FieldList

第3步:复制粘贴结果并执行

第4步:删除第一个字段

alter table #SOE drop column First

第5步:这是你的表

select * from #SOE

答案 2 :(得分:0)

您可以使用以下过程来执行您想要的操作。它只需要你:

  1. 在调用proc之前创建Temp Table(您将Temp Table名称传递给proc)。这允许临时表在当前作用域中使用,因为一旦proc结束/返回,就会删除在存储过程中创建的临时表。
  2. 在Temp Table中只放一个字段;数据类型是无关紧要的,因为该字段将被删除(您将字段名称传递给proc)
  3. [请务必将proc名称更改为您喜欢的任何名称,但在后面的示例中使用了temp proc名称]

    CREATE PROCEDURE #Abracadabra
    (
        @TempTableName SYSNAME,
        @DummyFieldName SYSNAME,
        @TestMode BIT = 0
    )
    AS
    SET NOCOUNT ON
    
    DECLARE @SQL NVARCHAR(MAX)
    
    SELECT @SQL = COALESCE(@SQL + N', [',
                           N'ALTER TABLE ' + @TempTableName + N' ADD [')
                   + [Title]
                   + N'] VARCHAR(100)'
    FROM #FieldList
    ORDER BY [ID]
    
    SET @SQL = @SQL
                + N' ; ALTER TABLE '
                + @TempTableName
                + N' DROP COLUMN ['
                + @DummyFieldName
                + N'] ; '
    
    IF (@TestMode = 0)
    BEGIN
        EXEC(@SQL)
    END
    ELSE
    BEGIN
        PRINT @SQL
    END
    GO
    

    以下示例显示了正在使用的proc。第一次执行是在测试模式下,它只打印将要执行的SQL。第二次执行运行SQL和SELECT,然后EXEC显示字段是FieldList表中的字段。

    /*
    -- HIGHLIGHT FROM "SET" THROUGH FINAL "INSERT" AND RUN ONCE
    -- to setup the example
    
    SET NOCOUNT ON;
    
    --DROP TABLE #FieldList
    CREATE TABLE #FieldList (ID INT, Title VARCHAR(50))
    
    INSERT INTO #FieldList (ID, Title) VALUES (1, 'City')
    INSERT INTO #FieldList (ID, Title) VALUES (2, 'UserSuppliedFieldName')
    INSERT INTO #FieldList (ID, Title) VALUES (3, 'SomeField')
    */
    
    
    IF (OBJECT_ID('tempdb.dbo.#Tmp') IS NOT NULL)
    BEGIN
        DROP TABLE #Tmp
    END
    CREATE TABLE #Tmp (Dummy INT)
    
    EXEC #Abracadabra
               @TempTableName = N'#Tmp',
               @DummyFieldName = N'Dummy',
               @TestMode = 1
    -- look in "Messages" tab
    
    EXEC #Abracadabra
               @TempTableName = N'#Tmp',
               @DummyFieldName = N'Dummy',
               @TestMode = 0
    
    SELECT * FROM #Tmp
    

    @TestMode = 1的输出:

      

    ALTER TABLE #Tmp ADD [City] VARCHAR(100),[UserSuppliedFieldName]   VARCHAR(100),[SomeField] VARCHAR(100); ALTER TABLE #Tmp DROP COLUMN   [假];