2009-06-15 13 views
16

Chciałbym wyeksportować ad hoc Wybierz zestaw wyników zapytania z SQL Server, aby eksportować bezpośrednio jako Wstawianie instrukcji.Narzędzie do eksportu zestawu wyników z SQL do instrukcji Insert?

chciałbym zobaczyć opcję Zapisz jako „Wstaw ..” wraz z innymi obecnymi dostępnych opcji (CSV, TXT) po kliknięciu prawym przyciskiem myszy w SSMS. Nie eksportuję z istniejącej tabeli fizycznej i nie mam uprawnień do tworzenia nowych tabel, więc opcje skryptowania tabel fizycznych nie są dla mnie opcją.

Mam do skryptu albo z tabel tymczasowych lub z zestawu wyników w oknie kwerendy.

Teraz można wyeksportować do pliku CSV, a następnie zaimportować ten plik do innego stolika, ale to czasochłonne dla powtarzalnej pracy.

Narzędzie musi stworzyć odpowiednie wkładki i zrozumieć typy danych podczas tworzenia wartości dla wartości NULL.

+0

Jeśli nie eksportujesz z istniejącej tabeli, jak do cholery chcesz otrzymać instrukcję select zamienioną na instrukcję insert? – Eric

+0

Tak, zakładasz, że możesz wstawiać tylko z tabeli o identycznym schemacie czy coś takiego? Nie rozumiem trudności. – dkretz

+1

Po wykonaniu instrukcji select otrzymuję zestaw wyników. Chcę wyeksportować ten zestaw wyników jako pęczek instrukcji wstawiania, aby odtworzyć ten sam zestaw wyników w innym miejscu. Zapomnij o istniejących tabelach. – Abdu

Odpowiedz

11

spojrzeć na SSMS Tools Pack dodać do SSMS który pozwala wykonać to, czego potrzebujesz.

+0

To tworzy z istniejącej tabeli. Potrzebuję utworzyć z zestawu wyników w oknie zapytania. – Abdu

+0

może to również zrobić. kliknij prawym przyciskiem myszy na zestaw wyników i wybierz opcję Skryptuj wyniki siatki. –

+0

Należy pamiętać, że @MladenPrajdic jest autorem programu (dzięki!), A pakiet narzędzi SSMS stał się produktem komercyjnym z wersji 2.5.0.0 wydanej 2012-09-18. Dostępna jest 30-dniowa wersja demo oraz starsze wersje, które wciąż są bezpłatne. –

2

wiem, że to nie jest dokładnie to, czego szukasz, ale można zrobić wkładkę off select:

wstawić do tbl (a, b) wybrać C, D z TBL2 gdzie C IN (...)

Oczywiście jest to dość szorstki, ale mam nadzieję, że się jest sens tego, co próbuję powiedzieć w poprzek.

+0

Chcę gotowe do wykonania instrukcji Insert, więc mogę je skopiować, aby wykonać je gdzie indziej. – Abdu

+0

Plus Nie mogę utworzyć nowych tabel, jeśli mówisz, że tbl jest nową tabelą. Myślałem, że moje pytanie było dość pouczające. – Abdu

13

Osobiście po prostu napiszę zaznaczenie na stole i sam wygeneruję wkładki. Bułka z masłem.

Na przykład:

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] 

będzie produkować

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 ... 

Kilka pułapek:

  1. Nie zapomnij owinąć pojedyncze cytaty
  2. ta zakłada czyste baza danych i nie jest bezpieczne dla SQL Injection.
+0

Dzięki, ale to jeszcze bardziej kłopotliwe niż eksportowanie do pliku, a następnie importowanie, szczególnie jeszcze bardziej przy pisaniu złożonych instrukcji wyboru. Plus zbyt wiele pojedynczych cytatów, o które trzeba się martwić! :) – Abdu

0

Napisałem scenariusz do tego problemu, który powinien działać na każdym stole. (Mówię "powinien", ponieważ skrypt nie jest w 100% testowany i nadal jest trochę szorstki.) Możesz go znaleźć pod adresem http://www.jessemclain.com/downloads/code/sql/spd_Tool_Get_Insert_Into_Values.sql.txt

Na dole pliku znajdują się śmieci, które dołącza firma hostingowa, po prostu usuń to wyłączone. Aby uruchomić, po prostu zmień wartość @Source_Table na swoją tabelę.

UWAGA: opublikowany plik tekstowy działa poprawnie w Firefoksie 3.0.11, ale nie w IE7.

1

WinSQL na stronie www.synametrics.com ma tę funkcję i jest bardzo przydatny. Nie wiem, czy ta funkcja jest dostępna w wersji darmowej - ale mimo to dostajesz wersję Professional, aby spróbować przez 30 dni.

To bardzo przydatne i łatwe w użyciu narzędzie do wyszukiwania dla dowolnej bazy danych połączonej z ODBC.

+0

WinSQL to robi. Szkoda, że ​​jest tylko w wersji Pro, która wynosi 249 $. – Abdu

1

TOAD może to zrobić z menu Zapisz jako menu.

+0

Nie widzę tego w wersji darmowej. Widzę Kreatora eksportu i format wyjściowy "Skrypt SQL", a następnie mówi, że ten format nie ma licencji. Zakładam, że oznacza to, że muszę kupić wersję komercyjną. Nie chcę płacić 595 $ (ich najtańsza wersja), żeby mieć tę funkcję. – Abdu

+0

Ta funkcja może nie być dostępna we wszystkich wersjach i/lub platformach, używam 9,7 dla Oracle. IMHO, TOAD jest warte ceny wstępu, choć oczywiście budżet i skala wartości różnią się. –

2

Squirrel SQL może to również zrobić.

Napisz zapytanie SQL, wykonaj je w celu przetestowania. Następnie zaznacz go i wybierz polecenie Skrypt/Wstaw (nie pamiętasz dokładnego sformułowania).

+1

W SQL Client klienta SQuirrel w wersji 3.2.1 ścieżką menu jest "Session/Scripts/Create Data Script from SQL". Właśnie to odkryłem dzięki temu komentarzowi. Dzięki Bogu za SO! – chaotic3quilibrium

3

To nie jest dokładnie to, co PO pytał, ale jeśli chcesz, aby wygenerować insert scenariusz wszystkich rekordów w tabeli, można to zrobić w SSMS (co najmniej 2012 - ewentualnie starsze wersje) bez dodatkowego dodatki.

Kliknij prawym przyciskiem myszy bazę danych zawierającą tabelę zawierającą dane i naciśnij . Zadania> Wygeneruj skrypty. Zostaniesz przeniesiony do czarodzieja, jak widzisz poniżej.

Po prostu naciśnij Dalej, jeśli wyświetli się ten pierwszy ekran. Just hit Next if this first screen is displayed.

Wybierz tabele, dla których chcesz wygenerować skrypt. Select the table(s) for which you would like to generate the script.

Wybierz jak chcesz skrypt wyprowadzane. Select how you want your script outputted. (I like the "new query window" option)
Podoba mi się opcja "nowe okno zapytania".

Hit przycisk Zaawansowane i wybierz dane tylko dla typów danych do skryptu Hit the Advanced button and select "Data only" for "Types of data to script"
Możesz patrzeć na opcje, aby zobaczyć, czy jest coś jeszcze chcesz zmodyfikować. Po zakończeniu naciśnij przycisk OK.

Hit Następna, aż dojdziesz do tego ekranu. Gdy wszystko pójdzie na zielono, otrzymasz swój skrypt insert! Hit Next until you get to this screen. Once everything goes green you'll have your script!
Chciałbym pozostawić ten ekran otwarty podczas testowania mojego skryptu, aby sprawdzić, czy muszę wprowadzić jakiekolwiek poprawki.

+0

To daje wszystkie dane. W moim przypadku spowoduje to 2 GB danych dla pewnej tabeli. Chcę utworzyć mniejszy zestaw testów dla testowej bazy danych. – Roel

4

UWAGA !!! JAK JEST. Na początku skryptu można zobaczyć przykład użycia procedury. Oczywiście możesz wprowadzić INSERT expresion, jeśli potrzebujesz, lub dodać DataTypes do wymaganej konwersji.

Wynik skryptu jest ustalony WYOBRAŻ wyniki z UNION ALL. Zachowaj ostrożność podczas porównywania swojej bazy danych. Nie testowałem innych zestawień więcej, niż potrzebuję.

przypadku długich polach Długość polecam używam [Zapisz wynik jako ..] w Result siatki zamiast Skopiuj. Bacause, możesz dostać skróconego skryptu.

/* 
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 
Powiązane problemy