【问题标题】:Cloning a table definition to a table variable in SQL Server将表定义克隆到 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

标签: sql sql-server tsql


【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-28
            • 2013-07-31
            相关资源
            最近更新 更多