将表变量插入到具有多个列(ID,数字等)的临时表中

时间:2016-03-31 23:19:13

标签: sql sql-server global-variables temp-tables

我需要在一个临时表中插入多个Table变量。

其中一个表变量是:

DECLARE @@TempTable_Number TABLE (Number bigint) 

insert into  @@TempTable_Number (Number) values ('000000000000');
insert into  @@TempTable_Number (Number) values ('100000000000');

这适用于只插入一个表变量

select * into ##GlobalTempTable_1 from @@TempTable_Number

我还有几个表变量,比如

DECLARE @@TempTable_ID TABLE (Number int) 

insert into  @@TempTable_ID (ID) values ('1');
insert into  @@TempTable_ID (ID) values ('12');

等...

我尝试将多个表变量中的数据插入一个TempTable:

Select * into  ####GlobalTempTable_1 From @@TempTable_ID,  @@TempTable_Number;

查询进入连续循环......

修改

其中一个表变量是:

DECLARE @@TempTable_Number TABLE (Number bigint, ID int) 

insert into  @@gvTempTable (Number) values ('21212321332332');
insert into  @@gvTempTable (Number) values ('100000000000');
insert into  @@gvTempTable (ID) values ('1');
insert into  @@gvTempTable (ID) values ('12');

select * into ##GlobalTempTable from @@gvTempTable;
select * from ##GlobalTempTable;

这会返回一种笛卡尔积

Result sets

2 个答案:

答案 0 :(得分:3)

使用UNION ALL

SELECT ID
INTO  ##GlobalTempTable_1 
FROM @@TempTable_ID
UNION ALL
SELECT Number
FROM @@TempTable_Number;

LiveDemo

Select * into  ####GlobalTempTable_1 From @@TempTable_ID,  @@TempTable_Number;
     

查询进入连续循环...

可能不是循环但是很长的查询。请注意,您执行Cartesian product

所以你的查询与:

相同
SELECT * 
INTO  ##GlobalTempTable_1 
FROM @@TempTable_ID
CROSS JOIN  @@TempTable_Number;

结果是NxM条记录,其中N是第一个表中的记录数,M是第二个表中的记录数。

答案 1 :(得分:0)

试试这个,

DECLARE @TempTable TABLE (
    ID INT
    ,Number BIGINT
    )

INSERT INTO @TempTable (Number)
VALUES ('21212321332332');

INSERT INTO @TempTable (Number)
VALUES ('100000000000');

INSERT INTO @TempTable (ID)
VALUES ('1');

INSERT INTO @TempTable (ID)
VALUES ('12');

--select * into #GlobalTempTable from @@gvTempTable;
--select * from ##GlobalTempTable;
SELECT *
FROM @TempTable

SELECT A.ID
    ,B.Number
FROM (
    SELECT ID
        ,ROW_NUMBER() OVER (
            ORDER BY ID
            ) TempId
    FROM @TempTable
    WHERE id IS NOT NULL
    ) A
INNER JOIN (
    SELECT number
        ,ROW_NUMBER() OVER (
            ORDER BY id
            ) TempId
    FROM @TempTable
    WHERE number IS NOT NULL
    ) B ON A.TempId = B.TempId