Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 复制表格并将其删除_Sql_Sql Server_Sql Server 2008_Tsql_Stored Procedures - Fatal编程技术网

Sql 复制表格并将其删除

Sql 复制表格并将其删除,sql,sql-server,sql-server-2008,tsql,stored-procedures,Sql,Sql Server,Sql Server 2008,Tsql,Stored Procedures,我知道我们可以简单地创建一个新表,然后通过 select * into tbl2 from tbl1 我想检查表tbl2是否存在,如果存在,则复制所有行;如果不存在,则创建一个新表,而无需在tbl2中指定列名,因为我正在tbl1中复制tbl2中的所有列。那么,我想扔掉旧桌子 if not exists(select * from tbl1 where id = 1) create table tbl2() drop tbl1 go 如果您不希望它成为temp table,请删除t

我知道我们可以简单地创建一个新表,然后通过

select * into tbl2 from tbl1
我想检查表tbl2是否存在,如果存在,则复制所有行;如果不存在,则创建一个新表,而无需在tbl2中指定列名,因为我正在tbl1中复制tbl2中的所有列。那么,我想扔掉旧桌子

if not exists(select * from tbl1 where id = 1)
   create table tbl2()
   drop tbl1
go

如果您不希望它成为temp table,请删除tempdb,这将检查tbl2,如果它确实存在,请插入表2中。如果它不存在,它将选择进入tbl2

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'schema' 
                 AND  TABLE_NAME = 'tbl2'))
BEGIN
    -- If the table exists, insert into:
    INSERT INTO tbl2 SELECT * from tbl1
    drop tbl1
END
ELSE
BEGIN
    SELECT * INTO tbl2 FROM tbl1
END

问题是,如果它确实存在,您如何确定表定义是完全相同的,如果您不希望进行这样的附加检查,并且始终假定它们是相同的,那么您可以使用INSERT INTO。。。从中选择*

IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl2]') AND type in (N'U'))
BEGIN
    -- create the table only if not there
    select * into tbl2 from tbl1 where 1 <> 1
END

insert into tbl2 select * from tbl1
exists代码块是由SQLServerManagementStudio生成的,我刚刚复制了它

IF (EXISTS (SELECT * 
         FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_NAME = 'tbl2'))
BEGIN
    -- tbl2 exists, so just copy rows
    INSERT INTO tbl2 SELECT * FROM tbl1;
END
ELSE BEGIN
    -- tbl2 doesn't exist, so create new table tbl2 and copy rows 
    SELECT * INTO tbl2 FROM tbl1;
    DROP tbl1;
END

但这不会复制索引、键等,只复制else分支中创建时的列名。

hi dan!它在tbl2不存在时工作,但在tbl2已经存在时给出错误。我不得不删除table_schema='schema'部分,工作正常。谢谢。啊,是的,您需要更改模式以匹配tbl1的模式。如果在多个schema(schema.tbl1 vs sch.tbl1)下存在相同的表名,则使用该部分可以确保查看正确的表。
IF  NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl2]') AND type in (N'U'))
BEGIN
    -- create the table only if not there
    select * into tbl2 from tbl1
END
ELSE BEGIN
    insert into tbl2 select * from tbl1
END
IF (EXISTS (SELECT * 
         FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_NAME = 'tbl2'))
BEGIN
    -- tbl2 exists, so just copy rows
    INSERT INTO tbl2 SELECT * FROM tbl1;
END
ELSE BEGIN
    -- tbl2 doesn't exist, so create new table tbl2 and copy rows 
    SELECT * INTO tbl2 FROM tbl1;
    DROP tbl1;
END