Sql server 从任意SQL查询生成CREATE TABLE语句
是否有脚本/过程/函数可以从任意SQL查询生成CREATETABLE语句 在构建过程时,我希望有一种快速生成临时表的方法,而不必查看查询中引用的所有表的表定义 简单的例子:Sql server 从任意SQL查询生成CREATE TABLE语句,sql-server,sql-server-2012,ssms,ssms-2012,Sql Server,Sql Server 2012,Ssms,Ssms 2012,是否有脚本/过程/函数可以从任意SQL查询生成CREATETABLE语句 在构建过程时,我希望有一种快速生成临时表的方法,而不必查看查询中引用的所有表的表定义 简单的例子: 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'
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工作流程:
选择文本
右键单击,选择生成创建表语句函数/script/proc called;结果放在剪贴板上
将光标放置在所需位置
粘贴
使用
执行该语句时,将创建表 使用
执行该语句时,将创建表 这是一个小技巧,但您可以尝试在表格中进行选择,请参见第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表,右键单击并生成创建表脚本
最后,您需要删除表delete\u me以进行清理。这有点像黑客,但您可以尝试选择一个表,请参见第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表,右键单击并生成创建表脚本
最后,您需要删除表delete\u me以进行清理。首先,我将创建查询的存储过程。它使我以后不会忘记它 其次,我将编写一个查询来为我生成表:
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”替换为您自己的存储过程的名称
注意:用您选择的表名替换此处的表名
上述内容将产生如下结果:
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
);
首先,我将创建查询的存储过程。它使我以后不会忘记它 其次,我将编写一个查询来为我生成表:
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”替换为您自己的存储过程的名称
注意:用您选择的表名替换此处的表名
上述内容将产生如下结果:
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
);
比临时表建议更好,因为SSMS无法编写脚本。比临时表建议更好,因为SSMS无法编写脚本。你也可以在2012年做一些事情。你也可以在2012年做一些事情