Создать оператор CREATE TABLE из произвольного SQL-запроса

Есть ли сценарий/процедура/функция, которая может генерировать инструкцию CREATE TABLE из произвольного SQL-запроса?

При построении процедур я хотел бы иметь быстрый способ создания временной таблицы, а не просматривать определения всех таблиц, на которые есть ссылки в запросе.

Простой пример:

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
)

Рабочий процесс ССМС:

  1. выделить текст
  2. щелкните правой кнопкой мыши, выберите Generate CREATE TABLE statement (вызывается функция/скрипт/процедура; результат помещается в буфер обмена)
  3. поместите курсор в нужное место
  4. вставить

person craig    schedule 01.04.2015    source источник
comment
Вы также могли что-то сделать с этим в 2012 году msdn.microsoft.com/en-us /библиотека/ff878602.aspx   -  person Martin Smith    schedule 02.04.2015


Ответы (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'

Затем вы можете выделить таблицу delete_me в SSMS, щелкнуть правой кнопкой мыши и сгенерировать сценарий CREATE TABLE.

Наконец, вы хотели бы DROP TABLE delete_me очиститься.

person Ed Gibbs    schedule 01.04.2015
comment
Лучше, чем предложение таблицы #temp на том основании, что SSMS не может их написать. - person Martin Smith; 02.04.2015

использовать

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'

и ваша таблица будет создана при выполнении инструкции.

person A ツ    schedule 01.04.2015

Прежде всего, я бы сделал хранимую процедуру запроса. (Это не дает мне забыть об этом позже)

Во-вторых, я бы написал запрос для создания таблицы для меня:

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
    );
person WonderWorker    schedule 04.08.2015