既然存在也要重新生成的话,那就有存在就删了重建就行了IF OBJECT_ID('临时表名')IS NOT NULL DROP TABLE 临时表名 GO SELECT * INTO 临时表名 FROM 数据表T1 WHERE 1=2
IF OBJECT_ID('临时表名')IS NULL OR EXISTS( SELECT 1 FROM(SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('数据表T1')) T1 FULL JOIN (SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('临时表名')) T2 ON T1.[name]=T2.[name]--名称 AND T1.xtype=T2.xtype--类型 AND T1.prec=T2.prec--精度 AND ISNULL(T1.scale,0)=ISNULL(T2.scale,0)--精度 AND T1.length=T2.length--长度 WHERE T1.name IS NULL OR T2.name IS NULL ) BEGIN IF OBJECT_ID('临时表名')IS NOT NULL DROP TABLE 临时表名 SELECT * INTO 临时表名 FROM 数据表T1 WHERE 1=2 END没注意需求,改进了下,你参考下
只要保障表名不重复情况下,create table...,select into都行;
我没有表达好,大家可能是木有理解我的意思数据表T1 记录表结构 id 字段名 字段类型 默认值 1 字段1 nvarchar(50) Y 2 字段2 nvarchar(50) null 3 字段3 bit 0 4 字段4 int 0 5 字段5 nvarchar(50) Y我要生成的数临时表的结构应该是这样的要生存的临时表应该是这样: ID 字段1 字段2 字段3 字段4 字段5
新生成的临时表 ID 是自增类型的 跟T1 表中的id没有关系这么说吧 临时表有多少个字段 每个字段都是什么数据类型 以及这些字段的默认值, 都是在 数据表T1中定义的
select * into #temp from T1 where 1=0
你这样要拼动态SQL,但是EXEC中创建的临时表会马上删除,完全符合做不到。 创建普通表没问题。 DECLARE @sql nvarchar(max) SET @sql = 'CREATE TABLE tempTable ('--为了拼SQL方便,要求T1.默认值是字符串的,加上引号。 SELECT @sql = @sql + ' '+字段名+' '+字段类型+' DEFAULT('+默认值+'),' FROM t1 ORDER BY idSET @sql = STUFF(@sql,LEN(@sql),1,' )') --PRINT @sql EXEC(@sql)
那那就这样IF OBJECT_ID('临时表名')IS NULL OR EXISTS( SELECT 1 FROM(SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('数据表T1')) T1 FULL JOIN (SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('临时表名')) T2 ON T1.[name]=T2.[name]--名称 AND T1.xtype=T2.xtype--类型 AND T1.prec=T2.prec--精度 AND ISNULL(T1.scale,0)=ISNULL(T2.scale,0)--精度 AND T1.length=T2.length--长度 WHERE T1.name IS NULL OR T2.name IS NULL ) BEGIN IF OBJECT_ID('临时表名')IS NOT NULL DROP TABLE 临时表名 SELECT identity(int,1,1)AS ID,* INTO 临时表名 FROM 数据表T1 WHERE 1=2 END这样得到的临时表,ID是自增,不过你原表不能有ID字段,不然会重复而出错,或者你临时表的ID取个不容易重复的字段名也可以
如果你可以不用默认值的话,倒是还有一种做法: 先用动态语句建普通表作为模板,用下面的语句复制表结构到临时表中 SELECT * INTO #temp FROM tempTable WHERE 1=0 模板表结构不变就一直留着不要删除,或者你可以在 t1 变动后马上重建模板表。
DROP TABLE 临时表名
GO
SELECT * INTO 临时表名 FROM 数据表T1 WHERE 1=2
IF OBJECT_ID('临时表名')IS NULL OR EXISTS(
SELECT 1
FROM(SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('数据表T1')) T1
FULL JOIN (SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('临时表名')) T2
ON T1.[name]=T2.[name]--名称
AND T1.xtype=T2.xtype--类型
AND T1.prec=T2.prec--精度
AND ISNULL(T1.scale,0)=ISNULL(T2.scale,0)--精度
AND T1.length=T2.length--长度
WHERE T1.name IS NULL OR T2.name IS NULL
)
BEGIN
IF OBJECT_ID('临时表名')IS NOT NULL
DROP TABLE 临时表名
SELECT * INTO 临时表名 FROM 数据表T1 WHERE 1=2
END没注意需求,改进了下,你参考下
id 字段名 字段类型 默认值
1 字段1 nvarchar(50) Y
2 字段2 nvarchar(50) null
3 字段3 bit 0
4 字段4 int 0
5 字段5 nvarchar(50) Y我要生成的数临时表的结构应该是这样的要生存的临时表应该是这样:
ID 字段1 字段2 字段3 字段4 字段5
创建普通表没问题。
DECLARE @sql nvarchar(max)
SET @sql = 'CREATE TABLE tempTable ('--为了拼SQL方便,要求T1.默认值是字符串的,加上引号。
SELECT @sql = @sql + '
'+字段名+' '+字段类型+' DEFAULT('+默认值+'),'
FROM t1
ORDER BY idSET @sql = STUFF(@sql,LEN(@sql),1,'
)')
--PRINT @sql
EXEC(@sql)
看来需要创建真实表,使用后再删除
这样频繁的建立删除 会不会有问题? 影响性能?
SELECT 1
FROM(SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('数据表T1')) T1
FULL JOIN (SELECT * FROM SYS.SYSCOLUMNS WHERE id=OBJECT_ID('临时表名')) T2
ON T1.[name]=T2.[name]--名称
AND T1.xtype=T2.xtype--类型
AND T1.prec=T2.prec--精度
AND ISNULL(T1.scale,0)=ISNULL(T2.scale,0)--精度
AND T1.length=T2.length--长度
WHERE T1.name IS NULL OR T2.name IS NULL
)
BEGIN
IF OBJECT_ID('临时表名')IS NOT NULL
DROP TABLE 临时表名
SELECT identity(int,1,1)AS ID,* INTO 临时表名 FROM 数据表T1 WHERE 1=2
END这样得到的临时表,ID是自增,不过你原表不能有ID字段,不然会重复而出错,或者你临时表的ID取个不容易重复的字段名也可以
先用动态语句建普通表作为模板,用下面的语句复制表结构到临时表中
SELECT * INTO #temp FROM tempTable WHERE 1=0
模板表结构不变就一直留着不要删除,或者你可以在 t1 变动后马上重建模板表。