从任意SQL查询生成CREATE TABLE语句

时间:2015-04-01 20:39:35

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

脚本/过程/函数是否可以从任意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(调用函数/脚本/ proc;结果放在剪贴板上)
  3. 将光标放在所需位置

3 个答案:

答案 0 :(得分:3)

这有点像黑客,但你可以尝试选择一个表(见第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进行清理。

答案 1 :(得分: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'

并在执行语句时创建表。

答案 2 :(得分:0)

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

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

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
    );