从临时表创建表选择脚本(类似于SSMSBoost提供从查询中选择脚本)

时间:2018-07-17 13:19:06

标签: sql sql-server sql-server-2008 tsql

我的要求是我需要从表/或复杂的查询结果中创建数据选择脚本。 (类似于SSMSBoost提供的从查询生成选择脚本的功能) 在这里,我已经在TSQL中为其开发了逻辑。

或者换句话说,无论结果如何显示在SSMS的DATAGRID中,我都不会将该数据用作选择脚本。

示例:以下是任何查询的结果

enter image description here

从上面的结果中我想生成它的选择脚本,如下所示。

SELECT * FROM ( VALUES 
(256087,'MCD','217647-A33')
,(256526,'MCD','217647-A33')
,(256777,'HARP','217647-A33')
,(256794,'MCD','217647-A33')
,(256835,'MCD','217647-A33')
 ) VTE
([ID],[prod],[provn&qw])

在SSMSBOOST中,如果您右键单击结果数据网格并单击选择脚本,它将为您生成此类脚本。如果没有SSMS Boost,我也想做同样的事情。

我的工作代码: 将查询结果保存到临时表中,将其分配给@TBL并运行它将生成结果。

我想执行此操作而不将数据保存到与SSMSBoost相同的临时表中。让我知道您是否还有其他想法。

DECLARE @QUERY VARCHAR(MAX);
DECLARE @TBL VARCHAR(20) = '#TEMP1';

;WITH CTE as
(
    SELECT distinct t.name as SYStype, '['+C.name+']' COLNAME, C.max_length , column_id
    FROM tempdb.sys.columns C
    INNER JOIN sys.types T on T.system_type_id = C.system_type_id
    WHERE [object_id] = OBJECT_ID(N'tempdb..'+@TBL)
    AND t.name <> 'sysname'
)
,LINES AS
( --CREATES SINGLE LINES 
SELECT distinct LN = concat('SELECT CONCAT('',('',', SUBSTRING((SELECT ','','',' + 
    CASE WHEN SYStype in('nvarchar','varchar','datetime','time','date') THEN CONCAT('CASE WHEN ',COLNAME,' IS NULL THEN ''NULL'' ELSE CONCAT('''''''',',' REPLACE(' ,COLNAME,','''''''','''''''''''')',','''''''') END') 
    ELSE  CONCAT('CASE WHEN ',COLNAME,' IS NULL THEN ''NULL'' ELSE CAST(',COLNAME,' AS VARCHAR(20)) END') END +''
    --ELSE COLNAME END 
FROM CTE
order by column_id FOR XML path (''), TYPE).value('.[1]', 'NVARCHAR(MAX)'),6,90000),','')'')',CHAR(10),' FROM '+@TBL)
)
select @QUERY=
concat('SELECT ''SELECT * FROM ( VALUES ''',CHAR(10),'UNION ALL',CHAR(10),
 LN 
,CHAR(10),'UNION ALL',CHAR(10),'SELECT '' ) VTE', CHAR(10),'(',
(SELECT SUBSTRING((SELECT ','+COLNAME FROM  CTE order by column_id FOR XML path (''), TYPE).value('.[1]', 'NVARCHAR(MAX)'),2,2000)) ,')''')
FROM LINES

EXECUTE (@QUERY);

1 个答案:

答案 0 :(得分:-1)

希望这会有所帮助: [编辑-抱歉,先前的答案不完整] @ mystring_1将是您的原始DDL字符串。 假定第一个逗号将始终位于位置25。

declare @mystring_1 varchar(100) ,
        @mystring_2 varchar(100) 
SET @mystring_1 = 'SELECT * FROM ( VALUES ' + CHAR(13) + ',' + ' other stuff , '
SET @mystring_2 = STUFF(@mystring_1, 25, 1, '')
PRINT @mystring_1
PRINT '-----'
PRINT @mystring_2