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

Posted

技术标签:

【中文标题】将表定义克隆到 SQL Server 中的表变量【英文标题】:Cloning a table definition to a table variable in SQL Server 【发布时间】:2018-12-14 08:56:12 【问题描述】:

有没有办法从现有表中克隆表定义并重新创建为表变量?

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

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

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

CREATE TABLE TempTable1 LIKE TempTableMain;

Microsoft SQL Server 可以做到这一点吗?

请注意,实际场景在@TempTable中包含超过60列,需要从原始表创建超过10个实例。


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

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

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

SELECT *
INTO @TempTable2
FROM @TempTable1

SELECT * FROM @TempTable2

【问题讨论】:

Select * into new_table from old_table? @Sami,我需要动态创建new_table 【参考方案1】:

Create user defined type 与您的表格的列,可以这样说:

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

然后使用这种类型声明你的表变量:

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

【讨论】:

【参考方案2】:

SQL Server 管理工作室为您提供了创建 sql 脚本以创建现有表的选项。

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

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

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

【讨论】:

【参考方案3】:

您可以执行以下命令:

SELECT * INTO #MyTable_tmp FROM MyTable

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

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

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

【讨论】:

【参考方案4】:

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

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

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

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

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

您也可以使用常规表而不是临时表。

【讨论】:

【参考方案5】:

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

/*
    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

【讨论】:

以上是关于将表定义克隆到 SQL Server 中的表变量的主要内容,如果未能解决你的问题,请参考以下文章

将 Microsoft SQL Server 中的文件表链接到 Microsoft Access 2016 中的表

如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型

SQL Server - 有啥方法可以加快插入 TVF 中的表变量的速度?

SQL Server:将列数据值从一个表复制到同一数据库中的另一个表

雪花中的 Javascript 函数将表名附加到当前日期

将表变量中的值插入到已经存在的临时表中