如何两次插入临时表

时间:2010-10-20 15:06:59

标签: sql sql-server-2008

我已经选择了类似以下内容的SQL:

IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name Like N'#tmp%'
 and id=object_id('tempdb..#tmp'))
DROP TABLE #tmp

into #tmp
select * from permTable

我需要在继续处理之前向#tmp添加更多数据:

insert into #tmp
select * from permTable2

但是这会产生错误,因为SQL假设#tmp列的大小和类型(例如,如果permTable有一个列为int的列,但permTable2的列具有相同的名称但在一个记录中有一个NULL,则“无法插入值NULL”进入'IsPremium'列,表'tempdb.dbo。#tmp')。

如何让#tmp拥有我想要的类型?这真是不好的做法吗?

3 个答案:

答案 0 :(得分:5)

您是否考虑过创建表格变量?您可以声明像

这样的列
declare @sometable table(
     SomeField [nvarchar](15),
     SomeOtherField [decimal](15,2));

答案 1 :(得分:1)

这就是为什么select into对你的问题不是很好。使用create table命令专门创建表结构,然后编写两个insert语句。

答案 2 :(得分:0)

不可能。

如果您需要立即生成表定义类型列表, 从select语句创建一个视图,并从information_schema中读取列及其定义...(本文不考虑小数和/或datetime2)

注意:这将使您当前选择的varchar / varbinary列的字段长度最小。
您需要手动调整它们...

SELECT 
      ','
    + COLUMN_NAME 
    + ' ' 
    + DATA_TYPE
    + ' '
    + ISNULL
    (
          '(' 
          + 
          CASE 
            WHEN CHARACTER_MAXIMUM_LENGTH = -1 
                THEN 'MAX' 
            ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS varchar(36)) 
            END 
        + ')' 
        , '' 
    ) 
    + ' '
    + CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE '' END 
FROM information_schema.columns 
WHERE table_name = '________theF'
ORDER BY ORDINAL_POSITION

插入语句的字段列表:

SELECT 
      ',' + COLUMN_NAME 
FROM information_schema.columns 
WHERE table_name = '________theF'
ORDER BY ORDINAL_POSITION