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