【问题标题】:Generate CREATE TABLE statement from arbitrary SQL query从任意 SQL 查询生成 CREATE TABLE 语句
【发布时间】:2015-04-01 20:39:34
【问题描述】:

是否有可以从任意 SQL 查询生成 CREATE TABLE 语句的脚本/过程/函数?

在构建过程时,我希望有一种快速生成临时表的方法,而不必查看查询中引用的所有表的表定义。

简单示例:

SELECT p.pat_id, pat_name, 
       enc_id, admsn_time, disch_time
FROM   patient p
INNER JOIN encounter e ON p.pat_id=e.pat_id
WHERE  admsn_time >= '01/01/2014'

将生成(从系统表中检索列的数据定义):

-- randomly-generated table name
CREATE TABLE #random_name (
  PAT_ID      VARCHAR(18) NOT NULL,
  PAT_NAME    VARCHAR(200),
  ENC_ID      NUMERIC(18,0) NOT NULL,
  ADMSN_TIME  DATE,
  DISCH_TIME  DATE
)

SSMS 工作流程:

  1. 选择文字
  2. 右击,选择Generate CREATE TABLE statement(调用函数/脚本/过程;结果放在剪贴板上)
  3. 将光标置于所需位置
  4. 粘贴

【问题讨论】:

标签: sql-server sql-server-2012 ssms ssms-2012


【解决方案1】:

这有点小技巧,但您可以尝试选择表格(参见第 3 行):

SELECT p.pat_id, pat_name, 
   enc_id, admsn_time, disch_time
INTO delete_me
FROM   patient p
INNER JOIN encounter e ON p.pat_id=e.pat_id
WHERE  admsn_time >= '01/01/2014'

然后可以在SSMS中高亮delete_me表,右键,生成CREATE TABLE脚本。

最后,你想DROP TABLE delete_me 进行清理。

【讨论】:

  • 优于#temp 表建议,因为 SSMS 无法编写这些脚本。
【解决方案2】:

使用

SELECT p.pat_id, pat_name, 
       enc_id, admsn_time, disch_time
into #randomtable
FROM   patient p
INNER JOIN encounter e ON p.pat_id=e.pat_id
WHERE  admsn_time >= '01/01/2014'

当您执行该语句时,您的表将被创建。

【讨论】:

    【解决方案3】:

    首先,我将创建一个查询的存储过程。 (它让我以后不会忘记它)

    其次,我会编写一个查询来为我生成表:

    DECLARE @CREATE_TABLE_QUERY NVARCHAR(MAX) = N'';
    
    
    SELECT 
        @CREATE_TABLE_QUERY += ', ' + name + ' ' + UPPER(system_type_name) + CHAR(13) + CHAR(10) + CHAR(9)
    
    FROM 
        sys.dm_exec_describe_first_result_set('YOUR_PROCEDURE_NAME_HERE', NULL, 1);
    
    
    SELECT 
        @CREATE_TABLE_QUERY = N'CREATE TABLE TABLE_NAME_HERE(' + CHAR(13) + CHAR(10) + CHAR(9) + STUFF(@CREATE_TABLE_QUERY, 1, 1, N'') + ');';
    
    PRINT @CREATE_TABLE_QUERY;
    

    注意:将“YOUR_PROCEDURE_NAME_HERE”替换为您自己的存储过程的名称。

    注意:将 TABLE_NAME_HERE 替换为您选择的表名。

    上面会生成这样的东西:

    CREATE TABLE TABLE_NAME_HERE(
         WeekName VARCHAR(40)
        , Line Name VARCHAR(50)
        , TheDate DATETIME
        , ReceivedAll INT
        , Answered INT
        , Abandoned INT
        , Call Length INT
        , WaitTimeAnswer INT
        , WaitTimeAbandon INT
        , PeriodName VARCHAR(10)
        , Week SMALLINT
        , Period SMALLINT
        , Year SMALLINT
        , WeekInPeriod SMALLINT
        , NumWeeksInPeriod SMALLINT
        , WeekendDate DATETIME
        , CRCOperative VARCHAR(100)
        , CallType VARCHAR(20)
        , Charge Time INT
        , SourceNumber VARCHAR(80)
        , DestinationNumber VARCHAR(80)
        , CallStart DATETIME
        , Out of Hours VARCHAR(12)
        , IsWorkingDay BIT
        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2017-04-01
      • 2015-05-06
      • 2010-09-06
      • 1970-01-01
      • 2012-09-22
      相关资源
      最近更新 更多