将表定义克隆到SQL Server中的表变量

时间:2018-12-14 08:56:12

标签: sql sql-server tsql

是否可以从现有表中克隆表定义并重新创建为表变量?

DECLARE @TempTable1 TABLE (ID INT, Description VARCHAR(256))

我需要重新创建一组具有相同列数和定义的表,而不必重复执行DECLARE TABLE语句。

此过程在MySQL上可用,如下所示。

CREATE TABLE TempTable1 LIKE TempTableMain;

是否可以通过Microsoft SQL Server做到这一点?

请注意,实际情况在@TempTable中包含60多个列,并且需要从原始表中创建10个以上的实例。


我不是在谈论数据插入或来自另一张表的SELECT离子,如下所示。我需要创建表定义。

DECLARE @TempTable TABLE(ID INT, Description VARCHAR(100))

INSERT INTO @TempTable 
VALUES (1, 'Test1'), (1, 'Test1');

SELECT *
INTO @TempTable2
FROM @TempTable1

SELECT * FROM @TempTable2

5 个答案:

答案 0 :(得分:5)

Createuser defined type中包含表格的各列,可以这样说:

CREATE TYPE MyTableType AS TABLE (ID INT, Description VARCHAR(256));

然后使用以下类型声明表变量:

DECLARE @Table1 MyTableType;
DECLARE @Table2 MyTableType;
DECLARE @Table3 MyTableType;

答案 1 :(得分:0)

SQL Server Management Studio使您可以选择创建sql脚本来创建已经存在的表。

右键单击表->脚本表为->创建到->新建查询编辑器窗口

这样,您不必每次都写出整个查询。

您甚至可以创建一个存储过程,该过程将要创建的表的名称作为参数并从while循环中运行它。

答案 2 :(得分:0)

您可以执行以下命令:

SELECT * INTO #MyTable_tmp FROM MyTable

然后修改您的MyTable,然后将数据复制回。我见过的其他方法是创建一个名为Mytable_Tmp的新表(不是临时表),这将是您的新表。桌子。

然后复制数据进行所需的任何迁移。然后,您将删除原始表并在Mytable上重命名。

运行SELECT * INTO #MyTable FROM MyTable时,SQL Server将创建一个名为#MyTable的新临时表,该表与select子句中的每个列和数据类型匹配。在这种情况下,我们选择*,因此它将与MyTable相匹配。这样只会创建不复制默认值,约束索引或其他任何内容的列。

答案 3 :(得分:0)

如果您正在使用表变量,则意味着您不想长时间使用它们,因为在每次脚本完成后它们都会被“遗忘”。

所以,我认为最简单的方法是使用这样的构造:

IF OBJECT_ID('tempdb.dbo.#tmpTable', 'U') IS NOT NULL 
  DROP TABLE #tmpTable;
SELECT * INTO #tmpTable FROM MyPrimaryTable

它会创建与您完全相同的临时表,如果您要使用空表,则可以使用:

SELECT * INTO #tmpTable FROM MyPrimaryTable WHERE 1 = 0

然后,临时表将具有与主表完全相同的架构。

您可以根据需要多次申请(根据需要创建任意数量的临时表)。

您也可以使用常规表代替临时表。

答案 4 :(得分:0)

如果要在删除现有表后重新创建表,则可以使用以下查询。

/*
    Create brands table 
*/

-- Old block of code
IF  EXISTS (SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[TOY].[BRANDS]') AND type in (N'U'))
DROP TABLE [TOY].[BRANDS]
GO

-- New block of code
DROP TABLE IF EXISTS [TOY].[BRANDS]
GO

-- Add new table
CREATE TABLE TOY.BRANDS
(
ID INT NOT NULL,
NAME VARCHAR(20) NULL
)
GO

-- Load the table with data
INSERT INTO TOY.BRANDS (ID, NAME) VALUES
(1, 'Ford'),
(2, 'Chevy'),
(3, 'Dodge'),
(4, 'Plymouth'),
(5, 'Oldsmobile'),
(6, 'Lincoln'),
(7, 'Mercury');
GO