SELECT INTO动态

时间:2011-12-27 20:02:57

标签: sql sql-server tsql

我需要动态地选择INTO目的地,如下所示:

if @param = 0
   :setvar TARGETTABLE  T_FOO
else
   :setvar TARGETTABLE  T_BAR

SELECT.... INTO $(TARGETTABLE) FROM......;

看起来像$(TARGETTABLE)总是解析为“T_BAR”。如何正确地做到这一点?

(SQLServer 2005)

3 个答案:

答案 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中注明的表名必须是不存在的表,以便您不会抛出错误