我有一个问题,我不知道如何在SQL中解决。还是两个问题。
表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来运行我的查询。
答案 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
这很可能比基于循环或光标的方法更高效,尽管如此,您的里程可能会有所不同。