我需要动态地选择INTO目的地,如下所示:
if @param = 0
:setvar TARGETTABLE T_FOO
else
:setvar TARGETTABLE T_BAR
SELECT.... INTO $(TARGETTABLE) FROM......;
看起来像$(TARGETTABLE)
总是解析为“T_BAR”。如何正确地做到这一点?
(SQLServer 2005)
答案 0 :(得分:2)
由于您正在创建一个新表,我假设没有任何预先存在的东西依赖于表名。为什么不用一些临时名称创建表,然后重命名呢?
SELECT.... INTO T_TEMP FROM......;
if @param = 0
EXEC sp_rename 'T_TEMP', 'T_FOO'
else
EXEC sp_rename 'T_TEMP', 'T_BAR'
答案 1 :(得分:0)
您可以通过动态SQL或只编写两个查询来执行此操作。我建议后者:
IF (@param = 0)
SELECT ... INTO T_FOO FROM ...;
ELSE
SELECT ... INTO T_BAR FROM ...;
答案 2 :(得分:0)
SELECT INTO
创建一个与FROM
子句中的表具有相同模式的表。换句话说,就像这样:
select *
into NewTable
from ExistingTable
这将创建NewTable
,其结构和架构与ExistingTable
相同。
你可以这样做:
if @param = 0
begin
select *
into NewTable1
from ExistingTable
end
else
begin
select *
into NewTable2
from ExistingTable
end
或者你可以这样做:
declare @newTableName varchar(100)
declare @dynamicSql varchar(1000)
if @param = 0
set @newTableName = 'NewTable1'
else
set @newTableName = 'NewTable2'
set @dynamicSql = 'select * into ' + @newTableName + ' from ExistingTable'
exec(@dynamicSql)
根据选项的数量(即您需要多少条件语句),如果是两个或三个,我会选择前者。如果新表名是存储过程的参数,我将使用动态SQL。
注意 :无论哪种方式,新表(... INTO TableName
中注明的表名必须是不存在的表,以便您不会抛出错误