SQL:在循环中使用变量来创建新表

时间:2015-12-02 11:42:42

标签: sql-server tsql

我有一个问题,我不知道如何在SQL中解决。还是两个问题。

  1. 创建一个循环,使用table1更新变量
  2. 使用源临时表名称中的变量和最终输出表的名称。
  3. 表1只有一列

    +--------+--+
    | Header |  |
    +--------+--+
    | Name1  |  |
    | Name2  |  |
    | Name3  |  |
    | Name4  |  |
    | ...    |  |
    +--------+--+
    

    所以我想遍历这些行并将它们用作变量@variable。类似的东西:

    IF OBJECT_ID('table_@variable','U') IS NOT NULL
    DROP TABLE table_@variable
    
    SELECT *
    INTO table_@variable
    FROM #@variable
    

    所以循环的第一个行程是:

    IF OBJECT_ID('table_Name1','U') IS NOT NULL
    DROP TABLE table_Name1
    
    SELECT *
    INTO table_Name1
    FROM #Name1
    

    第二个:

    IF OBJECT_ID('table_Name2','U') IS NOT NULL
    DROP TABLE table_Name2
    
    SELECT *
    INTO table_Name2
    FROM #Name2
    

    等等,只要table1中有行

    我希望我解释得很好。

    感谢您的帮助。 马特

    P.S。我正在使用Microsoft SQL Server Management Studio来运行我的查询。

2 个答案:

答案 0 :(得分:1)

您必须使用动态SQL来实现目标。

试试这个:

DECLARE @suffix varchar(100)
DECLARE #crs INSENSITIVE CURSOR FOR
SELECT header FROM yourtable
FOR READ ONLY
OPEN #crs
FETCH NEXT FROM #crs INTO @suffix
WHILE (@@FETCH_STATUS = 0)
BEGIN
    DECLARE @str nvarchar(1000)
    SET @str = N'IF OBJECT_ID(''table_' + @suffix + ''',''U'') IS NOT NULL
    DROP TABLE table_' + @suffix + '

    SELECT * INTO table_' + @suffix + ' FROM #' + @suffix
    EXECUTE sp_executesql @str
    FETCH NEXT FROM #crs INTO @suffix
END
CLOSE #crs
DEALLOCATE #crs

答案 1 :(得分:0)

正如另一个答案所说,您需要使用动态SQL来实现这一目标。动态SQL只是意味着您在字符串类型的变量(通常是varchar)中构建SQL查询,然后在结尾处执行变量的内容。

但是,虽然您需要动态SQL,但在您的情况下,您不需要任何类型的循环(或游标)来实现此目的。

而不是循环,构建所需动态查询字符串的更简洁方法是使用T-SQL的字符串连接运算符+=,如下所示:

declare @SQL varchar(max)=''    -- Create a variable to hold our dynamic SQL

select @SQL += 
'IF OBJECT_ID(''table_' + Header + ''',''U'') IS NOT NULL
    DROP TABLE table_' + Header + '

SELECT * INTO table_' + Header + ' FROM #' + Header + '

'
from Table1 -- @SQL will be added to for every row in this table

exec(@SQL)  -- Now run the contents of the variable as a SQL query itself

这很可能比基于循环或光标的方法更高效,尽管如此,您的里程可能会有所不同。