+ -
当前位置:首页 → 问答吧 → 关于创建临时表的小问题

关于创建临时表的小问题

时间:2011-11-07

来源:互联网

如:

select id=identity(int,1,1),* into #linshitable from deliveryplan
select * from #linshitable 
select id=identity(int,1,1),* into #linshitable from deliveryplan left join userinfo on userinfo.pid=deliveryplan .oid;
select * from #linshitable 


第二种连表创建临时表时不管2张表里有没有主键都没问题,
但是像第一种方式的,表deliveryplan里如果有主键,会提示创建不成功。

消息 8108,级别 16,状态 1,第 1 行
无法使用 SELECT INTO 语句将标识列添加到表 '#linshitable ',该表的列 'oid' 已继承了标识属性。

怎么解决这个问题呢?

作者: luoyehanfei   发布时间: 2011-11-07

一个表只能有一个自增列

作者: ssp2009   发布时间: 2011-11-07

oid已经是自增列了么?

作者: fredrickhu   发布时间: 2011-11-07

引用 2 楼 fredrickhu 的回复:
oid已经是自增列了么?

对。oid是自增列了。

作者: luoyehanfei   发布时间: 2011-11-07

但是第二种方法如果是连表时就不会出错。第二种的2个表里都带有主键自增列。 创建临时表是成功的,单表时不行。

作者: luoyehanfei   发布时间: 2011-11-07

SQL code

--在处理前,先检查表有没有自增列,针对不同情况,进行不同处理
declare @table_name varchar(255)
    if exists(select 1 from sysobjects,syscolumns 
        where sysobjects.name = @table_name
        and sysobjects.id = syscolumns.id
        and columnproperty(sysobjects.id, syscolumns.name, 'IsIdentity')  = '1')
    begin
        --有自增列时,将自增列字段排除在外
    end
    else
    begin
        --没有自增列的处理
    end

作者: jyh070207   发布时间: 2011-11-07

引用 5 楼 jyh070207 的回复:
SQL code


--在处理前,先检查表有没有自增列,针对不同情况,进行不同处理
declare @table_name varchar(255)
if exists(select 1 from sysobjects,syscolumns
where sysobjects.name = @table_name
and sysobjects……


但是临时表的数据我又必须带上原表的自增列,我要用到原始表的自增列呢。

作者: luoyehanfei   发布时间: 2011-11-07

SQL code

--一个表里一个自增列.
IF object_id('tb1')IS NOT NULL
DROP TABLE tb1
CREATE TABLE tb1
(
    id INT NOT NULL IDENTITY(1,1),
    SID INT 
)

DECLARE @a AS INT
SET @a=1
WHILE @a<20
    BEGIN
        INSERT INTO tb1 VALUES(@a)        
        --PRINT @a
        SET @a=@a+1
    END
SELECT *FROM tb1

IF object_id('tb2') IS NOT NULL
DROP TABLE tb2
CREATE TABLE tb2 
(
    vid INT NOT NULL IDENTITY(1,1),
    vname VARCHAR(20)
)

ALTER TABLE tb2 ALTER COLUMN vname VARCHAR(40)

DECLARE @c AS VARCHAR(40)='a'
WHILE LEN(@c)<20
    BEGIN
        INSERT INTO tb2 VALUES(@c+'a')
        --SELECT @c+'a'
        SET @c=@c+'a'
    END

SELECT IDENTITY(INT,1,1)AS nid,* INTO # FROM tb1 
CREATE VIEW tb1_2 
AS
(
    SELECT * FROM tb1 JOIN tb2 ON tb1.id=tb2.vid
)

SELECT IDENTITY(INT,1,1)AS nid,* INTO # FROM tb1_2
SELECT *FROM #



刚刚自己测试了一遍... 
select identity语句是不可以和有 自增列的真是表 插入到一张临时表里的..
不过这个语句是可以和(派生表),(虚拟表),(cte),(表表达式) 一起插入到临时表里的

语句是先执行from 的...因为from 后面用连接 把这个表变成了派生表...所以
select identity(int,1,1) 是可以跟这个派生表 一起插入到一张临时表里的...
水平有限,,,希望对你有帮助

作者: public0011   发布时间: 2011-11-07

3Q,虽然我没看完,但是兄弟你用心了。我用临时表是来做分页的,按照你这样下去,我直接用not in的效率更高了。。。。

作者: luoyehanfei   发布时间: 2011-11-07

SQL code
select identity(int,1,1) as idx,oid+0 as oid,name
into #a
from deliveryplan

作者: hongnacarla   发布时间: 2011-11-07

select into 不会把约束、索引、触发器复制过来,但是会把identity复制过来,所以要想把原始表插入一个identity的表,需要把原始的identity属性去掉,即oid+0 as oid

作者: hongnacarla   发布时间: 2011-11-07

这样应该可以了
SQL code

select id=identity(int,1,1),* 
into #linshitable 
from 
(select * from deliveryplan) a;

select * from #linshitable  


作者: stublue   发布时间: 2011-11-07

SQL code

--创建视图
create view vw
as
select * from deliveryplan

select id=identity(int,1,1),* into #linshitable from vw  --这个应该不会很影响性能吧
select * from #linshitable 

作者: public0011   发布时间: 2011-11-08

试了楼上几个兄弟的方法,好相都不行。感觉好相没有什么好的方法。楼主想用这个方法来进行分页的想法。怕是实现不了啊

作者: chenguang79   发布时间: 2011-11-08