2009-06-15 38 views
16

我想从SQL Server中导出一个ad hoc Select查询结果集,直接导出为Insert Statements。将结果集从SQL导出到Insert语句的工具?

我很想看到一个另存为选项“插入..”与其他当前可用的选项(CSV,TXT)在SSMS当你右击一起。我不从现有的物理表导出,也没有创建新表的权限,因此脚本物理表的选项不适合我。

我必须从临时表或从查询窗口中的结果集脚本。

现在我可以导出到csv,然后将该文件导入到另一个表中,但这对于重复性工作来说非常耗时。

该工具必须创建适当的插入,并在为NULL值创建值时了解数据类型。

+0

如果您不是从现有表中导出,您希望如何将select语句转换为插入语句? – Eric 2009-06-15 19:56:54

+0

是的,你是否假设你只能从具有相同模式或表的表中插入?我不明白这个困难。 – dkretz 2009-06-15 20:43:36

+1

当我执行select语句时,我得到一个结果集。我想将这个结果集导出为一堆插入语句,以在其他地方重新创建相同的结果集。忘记任何现有的表格。 – Abdu 2009-06-15 22:34:16

回答

11

看一看的SSMS Tools Pack添加在SSMS它允许你做什么您需要。

+0

这从现有的表中创建。我需要从查询窗口中的结果集创建。 – Abdu 2009-06-15 22:40:37

+0

它也可以做到这一点。右键单击结果集并选择脚本网格结果。 – 2009-06-16 10:02:05

2

我知道这是不是正是你要找的,但你可以做一个插入断select语句:

INSERT INTO TBL(A,B) 选择C,d FROM tbl2的,其中C IN (...)

显然,这是相当粗糙,但我希望得到的是什么我试图越过说的地步。

+0

我想准备好执行Insert语句,以便我可以将它们复制到其他地方执行。 – Abdu 2009-06-15 22:36:24

+0

另外如果你说tbl是一个新表,我不能创建新表。我认为我的问题很有意思。 – Abdu 2009-06-15 22:49:09

13

就个人而言,我只是写一个选择对表,并自己生成插入。小菜一碟。

例如:

SELECT 'insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values(''' + 
    [au_id] + ''', ''' + 
    [au_lname] + ''', ''' + 
    [au_fname] + ''', ''' + 
    [phone] + ''', ''' + 
    [address] + ''', ''' + 
    [city] + ''', ''' + 
    [state] + ''', ''' + 
    [zip] + ''', ' + 
    cast([contract] as nvarchar) + ');' 
FROM [pubs].[dbo].[authors] 

会产生

insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values('172-32-1176', 'White', 'Johnson', '408 496-7223', '10932 Bigge Rd.', 'Menlo Park', 'CA', '94025', 1); 
insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values('213-46-8915', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', '94618', 1); 
... etc ... 

几个陷阱:

  1. 别忘了换你的单引号
  2. 这是假定干净数据库和 不是SQL注入安全的。
+0

谢谢,但这比导出到文件然后导入更麻烦,特别是在编写复杂的select语句时更是如此。加太多的单引号担心! :) – Abdu 2009-06-15 22:44:10

0

我写了一个脚本对于这个问题,应该在任何工作表中。 (我说“应该”,因为脚本未经100%测试,仍然有点粗糙)。您可以在http://www.jessemclain.com/downloads/code/sql/spd_Tool_Get_Insert_Into_Values.sql.txt

找到它在托管公司附加文件底部有一些垃圾,只是剥离那关闭。要运行,只需将@Source_Table的值更改为表格即可。

注意:我发布的文本文件在Firefox 3.0.11中呈现良好,但在IE7中不呈现。

1

www.synametrics.com上的WinSQL具有该功能,非常方便。不知道该功能是否在免费版本中 - 但是无论如何,您都可以获得专业版本以尝试30天。

这是一个非常方便和易于使用的ODBC连接数据库的查询工具。

1

TOAD可以通过数据网格“另存为”菜单执行此操作。

2

Squirrel SQL也可以做到这一点。

编写一个SQL查询,执行它来测试。然后突出显示它,并选择脚本/插入语句(不记得确切的措词)。

3

这不是OP问什么,但如果你想生成一个表中的insert脚本所有记录,可以在SSMS中做到这一点(至少2012 - 可能是旧版本)没有任何额外的加载项。

右键单击包含容纳数据的表的数据库,并点击任务>生成脚本。你会被带到一个像下面看到的巫师。

如果显示第一个屏幕,请点击下一步。 Just hit Next if this first screen is displayed.

请选择您希望为其生成脚本的表格。 Select the table(s) for which you would like to generate the script.

选择希望如何输出脚本。 Select how you want your script outputted. (I like the "new query window" option)
我喜欢“新的查询窗口”选项。

点击高级按钮,然后选择数据只为数据类型脚本 Hit the Advanced button and select "Data only" for "Types of data to script"
您可能需要查看的选项,看看是否有别的什么事,你要修改。完成后点击OK。

点击下一步直到你到达这个屏幕。一旦一切都变绿了,你会有你的insert剧本! Hit Next until you get to this screen. Once everything goes green you'll have your script!
我喜欢让这个屏幕打开,而我测试了我的脚本,看看我是否需要做任何调整。

4

注意!按原样。在脚本的开始处,您可以看到如何使用过程的示例。当然,如果您需要或为所需的转换添加DataTypes,您可以进行INSERT expresion。

该脚本的结果与SELECT UNION ALL的concresated表达式相结合。 请仔细整理数据库。我没有比我需要的更多地测试其他排序规则。

对于长lenght领域我建议使用[保存的结果..]在结果网格,而不是复制。因为你可能会切割脚本。

/* 
USE AdventureWorks2012 
GO 

IF OBJECT_ID('tempdb..#PersonTbl') IS NOT NULL 
    DROP TABLE #PersonTbl; 
GO 

SELECT TOP (100) 
     BusinessEntityID 
     , PersonType 
     , NameStyle 
     , Title 
     , FirstName 
     , MiddleName 
     , LastName 
     , Suffix 
     , EmailPromotion 
     , CONVERT(NVARCHAR(MAX), AdditionalContactInfo) AS [AdditionalContactInfo] 
     , CONVERT(NVARCHAR(MAX), Demographics) AS [Demographics] 
     , rowguid 
     , ModifiedDate 
INTO #PersonTbl 
FROM Person.Person 

EXEC dbo.p_GetTableAsSqlText 
    @table_name = N'#PersonTbl' 

EXEC dbo.p_GetTableAsSqlText 
    @table_name = N'Person' 
    , @table_owner = N'Person' 
*/ 
/*********************************************************************************************/ 
IF OBJECT_ID('dbo.p_GetTableAsSqlText', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.p_GetTableAsSqlText 
GO 

CREATE PROCEDURE [dbo].[p_GetTableAsSqlText] 
    @table_name NVARCHAR(384) /*= 'Person'|'#Person'*/ 
    , @database_name NVARCHAR(384) = NULL /*= 'AdventureWorks2012'*/ 
    , @table_owner NVARCHAR(384) = NULL /*= 'Person'|'dbo'*/ 
/*WITH ENCRYPTION, RECOMPILE, EXECUTE AS CALLER|SELF|OWNER| 'user_name'*/ 
AS /*OLEKSANDR PAVLENKO p_GetTableAsSqlText ver.2016.10.11.1*/ 
    DECLARE @isTemporaryTable BIT = 0 

/*[DATABASE NAME]*/ 
    IF (PATINDEX('#%', @table_name) <> 0) 
     BEGIN 
      SELECT @database_name = DB_NAME(2) /*2 - 'tempdb'*/ 
        , @isTemporaryTable = 1 
     END 
    ELSE 
     SET @database_name = COALESCE(@database_name, DB_NAME()) 
/*END [DATABASE NAME]*/ 

/*[SCHEMA]*/ 
    SET @table_owner = COALESCE(@table_owner, SCHEMA_NAME()) 

    DECLARE @database_nameQuoted NVARCHAR(384) = QUOTENAME(@database_name, '') 
    DECLARE @table_ownerQuoted NVARCHAR(384) = QUOTENAME(@table_owner, '') 
    DECLARE @table_nameQuoted NVARCHAR(384) = QUOTENAME(@table_name, '') 

    DECLARE @full_table_name NVARCHAR(769) 
/*384 + 1 + 384*/ 
    DECLARE @table_id INT 

    SET @full_table_name = CONCAT(@database_nameQuoted, '.', @table_ownerQuoted, '.', @table_nameQuoted) 
    SET @table_id = OBJECT_ID(@full_table_name) 

    CREATE TABLE #ColumnTbl 
     (
     ColumnId INT 
     , ColName sysname COLLATE DATABASE_DEFAULT 
     , TypeId TINYINT 
     , TypeName sysname COLLATE DATABASE_DEFAULT 
     , TypeMaxLength INT 
     ) 

    DECLARE @dynSql NVARCHAR(MAX) = CONCAT(' 
INSERT INTO #ColumnTbl 
SELECT ISC.ORDINAL_POSITION AS [ColumnId] 
     , ISC.COLUMN_NAME AS [ColName] 
     , T.system_type_id AS [TypeId] 
     , ISC.DATA_TYPE AS [TypeName] 
     , ISC.CHARACTER_MAXIMUM_LENGTH AS [TypeMaxLength] 
FROM ', @database_name, '.INFORMATION_SCHEMA.COLUMNS AS [ISC] 
     INNER JOIN ', @database_name, '.sys.objects AS [O] ON ISC.TABLE_NAME = O.name 
     INNER JOIN ', @database_name, '.sys.types AS [T] ON ISC.DATA_TYPE = T.name 
WHERE ISC.TABLE_CATALOG = "', @database_name, '" 
     AND ISC.TABLE_SCHEMA = "', @table_owner, '" 
     AND O.object_id = ', @table_id) 

    IF (@isTemporaryTable = 0) 
     SET @dynSql = CONCAT(@dynSql, ' 
     AND ISC.TABLE_NAME = "', @table_name, '" 
') 
    ELSE 
     SET @dynSql = CONCAT(@dynSql, ' 
     AND ISC.TABLE_NAME LIKE "', @table_name, '%" 
') 

    SET @dynSql = REPLACE(@dynSql, '"', '''') 
    EXEC(@dynSql) 

    DECLARE @columnNamesSeparated NVARCHAR(MAX) = SUBSTRING((SELECT ', [' + C.ColName + ']' AS [text()] 
                  FROM #ColumnTbl AS [C] 
                  ORDER BY C.ColumnId 
                  FOR 
                  XML PATH('') 
                  ), 2, 4000) 
    --SELECT @columnNamesSeparated 

    DECLARE @columnNamesSeparatedWithTypes NVARCHAR(MAX) = SUBSTRING((SELECT '+", " + "CONVERT(' + (CASE C.TypeId 
                             WHEN 231 /*NVARCHAR*/ 
                             THEN CONCAT(C.TypeName, '(', 
                                (CASE WHEN C.TypeMaxLength = -1 THEN 'MAX' 
                                  ELSE CONVERT(NVARCHAR(MAX), C.TypeMaxLength) 
                                 END), ')') 
                             WHEN 239 /*NCHAR*/ 
                             THEN CONCAT(C.TypeName, '(', C.TypeMaxLength, ')') 
                             /*WHEN -1 /*XML*/ THEN '(MAX)'*/ 
                             ELSE C.TypeName 
                             END) + ', "+ COALESCE(' 
                       + (CASE C.TypeId 
                        WHEN 56 /*INT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 40 /*DATE*/ 
                        THEN 'N"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 101) + """"' 
                        WHEN 60 /*MONEY*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 61 /*DATETIME*/ 
                        THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 21) + """"' 
                        WHEN 104 /*BIT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 106 /*DECIMAL*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 127 /*BIGINT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 189 /*TIMESTAMP*/ 
                        THEN 'N"""" + CONVERT(NVARCHAR(MAX), SUBSTRING([' + C.ColName 
                          + '], 1, 8000), 1) + """"' 
                        WHEN 241 /*XML*/ 
                        THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + ']) + """"' 
                        ELSE 'N"""" + CONVERT(NVARCHAR(MAX), REPLACE([' + C.ColName 
                          + '], """", """""")) + """"' 
                        END) + ' , "NULL") + ") AS [' + C.ColName + ']"' + CHAR(10) COLLATE DATABASE_DEFAULT AS [text()] 
                     FROM  #ColumnTbl AS [C] 
                     ORDER BY C.ColumnId 
                    FOR 
                     XML PATH('') 
                    ), 9, 100000) 

/*SELECT @columnNamesSeparated, @full_table_name*/ 
    DECLARE @dynSqlText NVARCHAR(MAX) = CONCAT(N' 
SELECT (CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT 1)) = 1 THEN " 
-- INSERT INTO ', @full_table_name, ' 
--  (', @columnNamesSeparated, ' 
--  ) 
SELECT T.* --INTO #ResultTbl 
FROM (
" 
       ELSE "UNION ALL " 
       END) + "SELECT "+ ', @columnNamesSeparatedWithTypes, ' FROM ', @full_table_name) 
    SET @dynSqlText = CONCAT(@dynSqlText, ' UNION ALL SELECT ") AS [T] 

--SELECT * 
--FROM #ResultTbl 
"') 

    SET @dynSqlText = REPLACE(@dynSqlText, '"', '''') 
    --SELECT @dynSqlText AS [XML_F52E2B61-18A1-11d1-B105-00805F49916B] 
    EXEC(@dynSqlText) 

    IF OBJECT_ID('tempdb..#ColumnTbl') IS NOT NULL 
     DROP TABLE #ColumnTbl; 
GO