代码之家  ›  专栏  ›  技术社区  ›  Patrick

如何插入临时表两次

  •  3
  • Patrick  · 技术社区  · 14 年前

    我学习了一些类似以下的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的列的名称相同,但在一条记录中有一个空值,则您会得到“无法将值空值插入列'ispremium',表'tempdb.dbo.tmp”)。

    如何让TMP拥有我想要的类型?这真的是不好的练习吗?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Christoph Jonathan    14 年前

    是否考虑创建表变量?您可以这样声明列

    declare @sometable table(
         SomeField [nvarchar](15),
         SomeOtherField [decimal](15,2));
    
        2
  •  1
  •   HLGEM    14 年前

    这就是为什么选择进入对于您的问题来说是一个糟糕的主意。使用create table命令专门创建表结构,然后编写两个insert语句。

        3
  •  0
  •   Suraj Rao Raas Masood    6 年前

    这是不可能的。

    如果现在需要生成表定义类型列表, 从select语句创建一个视图,并从信息模式中读取列及其定义…(这件艺术品不考虑十进制和/或日期时间2)

    注意:这将为您当前选择的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
    

    以及insert语句的字段列表:

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