是否可以从现有表中克隆表定义并重新创建为表变量?
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
答案 0 :(得分:5)
Create和user 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