Sql server SQL:使用循环中的变量创建新表

Sql server SQL:使用循环中的变量创建新表,sql-server,tsql,Sql Server,Tsql,我有一个我不知道如何用SQL解决的问题。或者两个问题 创建一个使用表1更新变量的循环 使用源临时表名称和最终输出表名称中的变量 表1只有一列 +--------+--+ | Header | | +--------+--+ | Name1 | | | Name2 | | | Name3 | | | Name4 | | | ... | | +--------+--+ 所以我想循环这些行,并将它们用作变量@variable。比如: IF OBJECT_ID('table_

我有一个我不知道如何用SQL解决的问题。或者两个问题

  • 创建一个使用表1更新变量的循环
  • 使用源临时表名称和最终输出表名称中的变量 表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
    
    以此类推,只要表1中有行

    我希望我解释得足够好

    谢谢你的帮助。 马特


    p、 我正在使用MicrosoftSQLServerManagementStudio运行我的查询

    您必须使用动态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
    

    正如另一个答案所说,您需要使用动态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
    

    这很可能比基于循环或光标的方法性能更好,尽管一如既往,您的里程数可能会有所不同

    任何时候创建每个实体的表(表1、表2、表x)都可能是做错了!你在一个数据库中创造一个数据库。(当然,每个规则都有例外)在动态sql中仍然有
    表@variable
    ,这需要像其他相同的实例一样连接起来。@Jamiec:是的,可以使用表变量。我更喜欢我的向后兼容性表示法,因为我们不知道哪个版本的Sql Server使用我们的OPJamiec,这意味着代码行DROP TABLE TABLE_@变量实际上应该是DROP TABLE_@+@suffix@JoeTaras这只是工作完美,我将能够使用它在我的员工更多。非常感谢!!:)@MateuszKonopelski:祝你今天愉快;)