将表定义克隆到 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 中的表变量的速度?