Konwertowanie wyników Select na skrypt wstawiania - SQL Server [zamknięte]

107

Mam SQL Server 2008SQL Server Management Studio.

Muszę wybrać dane z Table1bazy danych database1. Następnie muszę edytować niektóre wartości w wynikach i insert values into Table1database2.

Albo pozwólcie, że przedstawię to inaczej.

Jak mogę przekonwertować dane w jednej tabeli na insert script.

Kapitan Komiks
źródło
Czy bazy danych znajdują się na tym samym serwerze? Jeśli tak, możesz włożyć jeden do drugiego. Wstaw do database2.dbo.myTable wybierz dane z database1.dbo.anOtherTable
u07ch
Tak, obie bazy danych znajdują się na tym samym serwerze. Ale potrzebuję skryptu. Przekażę te skrypty naszemu facetowi od bazy danych.
Captain Comic
Pomogłoby to w wyjaśnieniu tej kwestii. Czy jakieś podejście zadziała, czy potrzebujesz skryptu wstawiania, który możesz przekazać do swojej dba?
greg

Odpowiedzi:

31

Pakiet narzędzi SSMS (który jest BEZPŁATNY jak w piwie) ma wiele wspaniałych funkcji - w tym generowanie instrukcji INSERT z tabel.

Aktualizacja: w przypadku programu SQL Server Management Studio 2012 (i nowszych) pakiet narzędzi SSMS nie jest już bezpłatny, ale wymaga niewielkiej opłaty licencyjnej.

marc_s
źródło
+1 @marc_s Sporo pracy wykonałem generując takie skrypty wstawiające i wypisując skrypty generatora T-SQL, a teraz mówisz mi, że jest narzędzie.
bernd_k
Zachowaj ostrożność, gdy tabele przechowują dane dotyczące pieniędzy . Ten typ danych może przechowywać więcej miejsc dziesiętnych niż zwykle wyświetlane lub w skryptach generowanych przez pakiet narzędzi SSMS
bernd_k
13
To już nie jest darmowe. ssmstoolspack.com/Licensing
greg
@Greg: dzięki za wskazanie tego. Uwaga: licencjonowanie dotyczy tylko programu SQL Server Management Studio 2012 i nowszych - w przypadku wcześniejszych wersji pakiet narzędzi jest nadal bezpłatny.
marc_s
4
Alternatywa dla pakietu narzędzi SSMS ?
Kiquenet
160

Oto inna metoda, która w niektórych sytuacjach może być łatwiejsza niż instalacja wtyczek lub narzędzi zewnętrznych:

  • Zrób .select [whatever you need]INTO temp.table_namefrom [... etc ...]
  • Kliknij prawym przyciskiem myszy bazę danych w Object Explorer => Tasks => Generate Scripts
  • Wybierz temp.table_namena ekranie „Wybierz obiekty”, kliknij Dalej.
  • Na ekranie „Określ, jak mają być zapisywane skrypty”:
    • Kliknij Zaawansowane, znajdź właściwość „Typy danych do skryptu”, wybierz „Tylko dane”, zamknij właściwości zaawansowane.
    • Wybierz „Zapisz w nowym oknie zapytania” (chyba że masz tysiące rekordów).
  • Kliknij Dalej, zaczekaj na zakończenie zadania, obserwuj, jak wynikowe INSERTinstrukcje pojawiają się w nowym oknie zapytania.
  • Użyj funkcji Znajdź i zamień, aby zmienić wszystko [temp.table_name]na [your_table_name].
  • drop table [temp.table_name].
KT.
źródło
Użycie instrukcji INTO temp.table1 generuje następujący błąd: Określona nazwa schematu „temp” nie istnieje lub nie masz uprawnień do jej używania. Używam SQL 2012.
Mark
3
temptutaj odnosi się do dowolnego schematu, do którego masz dostęp. Możesz albo utworzyć jeden ( create schema temp), a następnie usunąć go, gdy skończysz, lub (lepiej) po prostu użyć dowolnego schematu, w którym aktualnie pracujesz.
KT.
1
Dziękuję za to, wiedziałem, że musi być sposób! Nawiasem mówiąc, możesz pominąć tworzenie tabeli tymczasowej, jeśli potrzebujesz tylko całych danych z tabeli, którą chcesz skryptować.
FAB
Musiałem użyć tego do zaimportowania danych do Azure Database. Zaimportuj go do innej niż lazurowa bazy danych, a następnie wyodrębnij jako wstawki SQL.
m12lrpv
2
Wciąż zadziwia mnie to, że program SSMS nie dodał tej możliwości „wyświetlania danych wyjściowych jako skryptu wstawiania” w zestawach wyników .. ale powyższe podejście działa, chociaż tworzy indywidualne polecenia wstawiania zamiast wykonywania prawidłowego wstawiania zbiorczego (powiedzmy 1000 elementów na wstawkę ) tak, jak powinien. To może zająć wieczność, aby działać na naprawdę dużych zestawach wyników
Traderhut Games
60

W SSMS:

  • Kliknij prawym przyciskiem myszy bazę danych> Zadania> Generuj skrypty

  • Kolejny

  • Wybierz „Wybierz określone obiekty bazy danych” i zaznacz tabelę, którą chcesz skrypty, Dalej

  • Kliknij Advanced >listę opcji, przewiń w dół i poszukaj opcji „Typy danych do skryptu” i zmień ją na „Tylko dane”> OK

  • Wybierz „Zapisz w nowym oknie zapytania”> Dalej> Dalej> Zakończ

Wszystkie 180 wierszy jest teraz zapisanych jako 180 instrukcji wstawiania!

Tember
źródło
12
Przydatne do kilku rzędów. Nieprzydatne : jeśli tabela ma 20000 wierszy, a chcę tylko 20 wstawień dla 20 wierszy.
Kiquenet
2
@Kiquenet - Możesz najpierw utworzyć widok, który wybierze żądane 20 wierszy, a następnie wykonaj następujące kroki, aby utworzyć skrypty wstawiania na podstawie widoku. Następnie możesz wykonać masowe wyszukiwanie i zastępowanie, aby zmienić nazwę widoku z powrotem na dowolną nazwę tabeli, do której chcesz wstawić.
tember
@tember To nie działa w widoku, jak mówisz, ale DZIAŁA w programie Visual Studio: najpierw tworzysz widok z wymaganym wyborem w sql studio, następnie otwierasz Visual Studio, łączysz się z serwerem sql i generujesz skrypt na tym utworzonym widoku.
Sergii
Dziękuję za te informacje. Chociaż zrzucenie całego stołu to przesada, rozwiązało mój problem.
paulz
Oszczędza życie. Pisałem scenariusze przez całe życie.
Jay
39

Metoda natywna :

na przykład jeśli masz stół

Users(Id, name)

Możesz to zrobić:

select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
Andrew Orsich
źródło
Możesz to zrobić w ten sposób, ale jeśli masz więcej niż kilka tabel, musisz trochę pisać. W Google są napisane i dostępne w Google usługi, które robią to za Ciebie, lub, jeśli masz VS2012, możesz kazać VS zrobić to za Ciebie. Zobacz moją odpowiedź poniżej.
greg
1
Przydatne w przypadku tabel z kilkoma polami. Jeśli tabela ma 50, 60, 100 kolumn jest nieprzydatna. Kod SQL
Kiquenet
24

1- Wyjaśnienie skryptów

A) Składnia wstawiania danych do tabeli jest następująca

Insert into table(col1,col2,col3,col4,col5)    

             -- To achieve this part i    
             --have used below variable
                ------@CSV_COLUMN-------

values(Col1 data in quote, Col2..quote,..Col5..quote)

-- To achieve this part 
-- i.e column data in 
--quote i have used 
--below variable
----@QUOTED_DATA---

C) Aby uzyskać powyższe dane z istniejącej tabeli musimy napisać zapytanie wybierające w taki sposób, aby wynik miał postać jak wyżej wymienionych skryptów

D) Wreszcie mam Concatenated powyżej zmiennej, aby utworzyć ostateczny skrypt, który wygeneruje skrypt wstawiania podczas wykonywania

MI)

@TEXT='SELECT ''INSERT INTO
 '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION

F) I wreszcie wykonałem powyższe zapytanie EXECUTE(TEXT)

QUOTENAME()Funkcja G) służy do zawijania danych kolumny wewnątrz cudzysłowu

H) ISNULLjest używany, ponieważ jeśli którykolwiek wiersz zawiera NULL dane dla dowolnej kolumny, zapytanie kończy się niepowodzeniem i zwraca NULL, dlaczego, aby tego uniknąć, użyłemISNULL

I) I stworzyłem sp sp_generate_insertscripts dla tego samego

1- Po prostu wpisz nazwę tabeli, dla której chcesz insert script

2- Warunek filtru, jeśli chcesz uzyskać konkretne wyniki

----------Final Procedure To generate Script------

CREATE PROCEDURE sp_generate_insertscripts
(
    @TABLE_NAME VARCHAR(MAX),
    @FILTER_CONDITION VARCHAR(MAX)=''
)
AS
BEGIN

SET NOCOUNT ON

DECLARE @CSV_COLUMN VARCHAR(MAX),
        @QUOTED_DATA VARCHAR(MAX),
        @TEXT VARCHAR(MAX)

SELECT @CSV_COLUMN=STUFF
(
    (
     SELECT ',['+ NAME +']' FROM sys.all_columns 
     WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND 
     is_identity!=1 FOR XML PATH('')
    ),1,1,''
)

SELECT @QUOTED_DATA=STUFF
(
    (
     SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns 
     WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND 
     is_identity!=1 FOR XML PATH('')
    ),1,1,''
)

SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION

--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT

EXECUTE (@TEXT)

SET NOCOUNT OFF

END
Param Yadav
źródło
Wykonałeś
14

Można to zrobić za pomocą Eksploratora obiektów programu Visual Studio SQL Server.

Możesz kliknąć „Wyświetl dane” z menu kontekstowego dla potrzebnej tabeli, przefiltrować wyniki i zapisać wynik jako skrypt.

BotanMan
źródło
1
Twój post jest poprawny i najłatwiejszy przy użyciu narzędzi SQL Server Data Tools w programie Visual Studio, tutaj i tutaj jest post, który wyjaśnia, w jaki sposób pomaga wygenerować instrukcję wstawiania dla pierwszych 1000 wierszy .
shaijut
8

Korzystając z programu Visual Studio, wykonaj następujące czynności

Utwórz projekt typu SQL Server -> Projekt bazy danych programu SQL Server

otwórz eksplorator serwera sql CTL- \, CTL-S

dodaj SQL Server, klikając prawym przyciskiem myszy ikonę SQL SERVER. Selcet DODAJ NOWY SERWER

przejdź w dół do tabeli, która Cię interesuje

prawy przycisk myszy -> WYŚWIETL DANE

Kliknij lewą górną komórkę, aby podświetlić wszystko (ctl-A nie wydaje się działać)

Kliknij prawym przyciskiem myszy -> SCript

To jest wspaniałe. Przez lata próbowałem wszystkiego, co wymieniono powyżej. Wiem, że istnieje narzędzie, które zrobi to i wiele więcej, nie mogę wymyślić jego nazwy. Ale to jest bardzo drogie.

Powodzenia. Właśnie to rozgryzłem. Nie testowałem go szczegółowo z polami tekstowymi itp., Ale wygląda na to, że zabiera Cię to daleko w dół.

Greg

greg
źródło
1
To nie konwertuje wybranych wyników, po prostu tworzy skrypty z tabeli.
Eric K
@QuantumDynamix - pierwotne pytanie jest wyjaśnione u dołu przez „Jak mogę przekonwertować dane z jednej tabeli na skrypt”. Poniżej znajduje się próbka mojego podejścia. Dokładnie o to zapytał użytkownik. W rzeczywistości jest to jedyne rozwiązanie, które widzę, które faktycznie tworzy skrypt wstawiania, o co pyta użytkownik. Dlaczego głos przeciw? Co oznacza „nie konwertuje wybranych wyników”? SET IDENTITY_INSERT [PMDB]. [BUAttr] ON INSERT INTO [PMDB]. [BUAttr] ([id], [BU], [Name], [Value]) VALUES (1, N'ALASKA ', N'GeoCenter Lat' , N'67.07213 ')
greg
to razem z tworzeniem tabel tymczasowych zrobiło to za mnie
harishr
4

Utwórz oddzielną tabelę za pomocą instrukcji into Na przykład

Wybierz * do Test_123 z [dbo]. [Pracownik], gdzie Nazwa taka jak „% Test%”

Przejdź do bazy danych Kliknij prawym przyciskiem myszy w bazie danych Kliknij na Generuj skrypt Wybierz swoją tabelę Wybierz opcję Advanace i wybierz Atrybut "Tylko dane" Wybierz plik "Otwórz w nowym zapytaniu"

Sql wygeneruje dla Ciebie skrypt

KMR
źródło
3

Możesz wybrać opcję `` Wynik do pliku '' w SSMS i wyeksportować wybrany wynik do pliku i wprowadzić zmiany w pliku wyników, a na koniec za pomocą BCP - Kopia zbiorcza, którą możesz wstawić do tabeli 1 w bazie danych 2.

Myślę, że w przypadku wstawiania zbiorczego musisz przekonwertować plik .rpt na plik .csv

Mam nadzieję, że to pomoże.

Pankaj Agarwal
źródło
2

Miałem podobny problem, ale potrzebowałem móc stworzyć instrukcję INSERT z zapytania (z filtrami itp.)

Stworzyłem więc następującą procedurę:

CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN

    DECLARE @fields NVARCHAR(max);
    DECLARE @select NVARCHAR(max);

    -- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query
    SELECT
        @fields = COALESCE(@fields + ', ', '') + '[' + name +']', 
        @select = COALESCE(@select + ', ', '') + ''''''' + ISNULL(CAST([' + name + '] AS NVARCHAR(max)), ''NULL'')+'''''''
    FROM tempdb.sys.columns 
    WHERE [object_id] = OBJECT_ID(N'tempdb..'+@input);

    -- Run the a dynamic query with the fields from @select into a new temp table
    CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max))
    DECLARE @stmt NVARCHAR(max) = 'INSERT INTO #ConvertQueryToInsertTemp SELECT '''+ @select + ''' AS [strings] FROM '+@input
    exec sp_executesql @stmt

    -- Output the final insert statement 
    SELECT 'INSERT INTO ' + @target + ' (' + @fields + ') VALUES (' + REPLACE(strings, '''NULL''', 'NULL') +')' FROM #ConvertQueryToInsertTemp

    -- Clean up temp tables
    DROP TABLE #ConvertQueryToInsertTemp
    SET @stmt = 'DROP TABLE ' + @input
    exec sp_executesql @stmt
END

Możesz go następnie użyć, zapisując dane wyjściowe zapytania w tabeli tymczasowej i uruchamiając procedurę:

-- Example table
CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME)
INSERT INTO Dummy VALUES (1 , 'Foo', GetDate()), (2, 'Bar', GetDate()), (3, 'Foo Bar', GetDate())

-- Run query and procedure
SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3
EXEC dbo.ConvertQueryToInsert '#TempTableForConvert', 'dbo.Dummy'

Uwaga: Ta procedura tylko rzutuje wartości na ciąg, co może spowodować, że dane będą wyglądać nieco inaczej. Na przykład w przypadku DATETIME sekundy zostaną utracone.

JollyBrackets
źródło
2

Jest to bardziej wszechstronne rozwiązanie (które może zrobić trochę więcej niż zadaje pytanie) i może być używane w oknie zapytania bez konieczności tworzenia nowego przechowywanego procesu - przydatne w produkcyjnych bazach danych na przykład, gdy nie masz uprawnień do zapisu .

Aby użyć kodu, zmodyfikuj go zgodnie z komentarzami w wierszu, które wyjaśniają jego użycie. Następnie możesz po prostu uruchomić to zapytanie w oknie zapytania, a wydrukuje ono wymagane instrukcje INSERT.

SET NOCOUNT ON

-- Set the ID you wish to filter on here
DECLARE @id AS INT = 123

DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128))

-- Add any tables you wish to generate INSERT statements for here. The fields are as thus:
 -- Name: Your table name
 -- IdField: The field on which to filter the dataset
 -- IdInsert: If the primary key field is to be included in the INSERT statement
 -- Excluded: Any fields you do not wish to include in the INSERT statement
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable1', 'Id', 0, 'Created,Modified')
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable2', 'Id', 1, 'Created,Modified')

DECLARE @numberTypes TABLE (sysId TINYINT)

-- This will ensure INT and BIT types are not surrounded with quotes in the
-- resultant INSERT statement, but you may need to add more (from sys.types)
INSERT @numberTypes(SysId) VALUES(56),(104)

DECLARE @rows INT = (SELECT COUNT(*) FROM @tables)
DECLARE @cnt INT = 1

DECLARE @results TABLE (Sql NVARCHAR(4000))

WHILE @cnt <= @rows
BEGIN
    DECLARE @tablename AS NVARCHAR(128)
    DECLARE @idField AS NVARCHAR(128)
    DECLARE @idInsert AS BIT
    DECLARE @excluded AS NVARCHAR(128)
    SELECT
        @tablename = Name,
        @idField = IdField,
        @idInsert = IdInsert,
        @excluded = Excluded
    FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt

    DECLARE @excludedFields TABLE (FieldName NVARCHAR(128))
    DECLARE @xml AS XML = CAST(('<X>' + REPLACE(@excluded, ',', '</X><X>') + '</X>') AS XML)
    INSERT INTO @excludedFields SELECT N.value('.', 'NVARCHAR(128)') FROM @xml.nodes('X') AS T(N)

    DECLARE @setIdentity NVARCHAR(128) = 'SET IDENTITY_INSERT ' + @tablename

    DECLARE @execsql AS NVARCHAR(4000) = 'SELECT ''' + CASE WHEN @idInsert = 1 THEN @setIdentity + ' ON' + CHAR(13) ELSE '' END + 'INSERT INTO ' + @tablename + ' ('
    SELECT @execsql = @execsql +
    STUFF
    (
        (
            SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN ', ' + name ELSE '' END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 2, ''
    ) +
    ')' + CHAR(13) + 'VALUES (' +
    STUFF
    (
        (
            SELECT
                CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN
                    ''', '' + ISNULL(' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ''''''''' + ' END +
                    'CAST(' + name + ' AS VARCHAR)' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ' + ''''''''' END +
                    ', ''NULL'') + '
                ELSE ''
                END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 3, ''
    ) +
    ''')' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + ' OFF' ELSE '' END +
    ''' FROM ' + @tablename + ' WHERE ' + @idField + ' = ' + CAST(@id AS VARCHAR)

    INSERT @results EXEC (@execsql)
    DELETE @excludedFields
    SET @cnt = @cnt + 1
END

DECLARE cur CURSOR FOR SELECT Sql FROM @results
OPEN cur

DECLARE @sql NVARCHAR(4000)
FETCH NEXT FROM cur INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @sql
    FETCH NEXT FROM cur INTO @sql
END

CLOSE cur
DEALLOCATE cur
Neo
źródło
1

Stworzyłem procedure:

if object_id('tool.create_insert', 'P') is null
begin
  exec('create procedure tool.create_insert as');
end;
go

alter procedure tool.create_insert(@schema    varchar(200) = 'dbo',
                                   @table     varchar(200),
                                   @where     varchar(max) = null,
                                   @top       int = null,
                                   @insert    varchar(max) output)
as
begin
  declare @insert_fields varchar(max),
          @select        varchar(max),
          @error         varchar(500),
          @query         varchar(max);

  declare @values table(description varchar(max));

  set nocount on;

  -- Get columns
  select @insert_fields = isnull(@insert_fields + ', ', '') + c.name,
         @select = case type_name(c.system_type_id)
                      when 'varchar' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + cast(' + c.name + ' as varchar) + '''''''', ''null'')'
                      when 'datetime' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + convert(varchar, ' + c.name + ', 121) + '''''''', ''null'')'
                      else isnull(@select + ' + '', '' + ', '') + 'isnull(cast(' + c.name + ' as varchar), ''null'')'
                    end
    from sys.columns c with(nolock)
         inner join sys.tables t with(nolock) on t.object_id = c.object_id
         inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id
   where s.name = @schema
     and t.name = @table;

  -- If there's no columns...
  if @insert_fields is null or @select is null
  begin
    set @error = 'There''s no ' + @schema + '.' + @table + ' inside the target database.';
    raiserror(@error, 16, 1);
    return;
  end;

  set @insert_fields = 'insert into ' + @schema + '.' + @table + '(' + @insert_fields + ')';

  if isnull(@where, '') <> '' and charindex('where', ltrim(rtrim(@where))) < 1
  begin
    set @where = 'where ' + @where;
  end
  else
  begin
    set @where = '';
  end;

  set @query = 'select ' + isnull('top(' + cast(@top as varchar) + ')', '') + @select + ' from ' + @schema + '.' + @table + ' with (nolock) ' + @where;

  insert into @values(description)
  exec(@query);

  set @insert = isnull(@insert + char(10), '') + '--' + upper(@schema + '.' + @table);

  select @insert = @insert + char(10) + @insert_fields + char(10) + 'values(' + v.description + ');' + char(10) + 'go' + char(10)
    from @values v
   where isnull(v.description, '') <> '';
end;
go

Następnie możesz to wykorzystać w ten sposób:

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'customer',
                        @where  = 'id = 1',
                        @insert = @insert output;

-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
  set @end = charindex(char(10), @insert);

  if @end = 0
  begin
    set @end = len(@insert) + 1;
  end;

  print substring(@insert, @start, @end - 1);
  set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;

Wynik byłby taki:

--DBO.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go

Jeśli chcesz tylko uzyskać zakres wierszy, użyj @topparametru w następujący sposób:

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'customer',
                        @top    = 100,
                        @insert = @insert output;

-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
  set @end = charindex(char(10), @insert);

  if @end = 0
  begin
    set @end = len(@insert) + 1;
  end;

  print substring(@insert, @start, @end - 1);
  set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;
Sorack
źródło
To pomaga, ale skróciło to pole „6C2A94737A456C405FDCF793DFA6E661: BqRc / DpUIe27” do tylko „6C2A94737A456C405FDCF793DFA6E6”
Adam Mendoza
0

Jeśli używasz Oracle (lub konfigurujesz aplikację do SQL Server), Oracle SQL Developer zrobi to za Ciebie. wybierz „unload” dla tabeli i postępuj zgodnie z opcjami (odznacz DDL, jeśli nie chcesz, aby cała tabela tworzyła rzeczy).

Liam
źródło
1
Jest to wyraźnie oznaczone jako pytanie dotyczące SQL Server ...
BentOnCoding
Możliwe jest również użycie programisty Oracle sql z serwerem sql. Zredagowałem moją odpowiedź.
Liam
0

Znalazłem ten dodatek SMSMS Boost , który jest darmowy i robi dokładnie to między innymi. Możesz kliknąć prawym przyciskiem myszy wyniki i wybrać Dane skryptu jako.

DAud
źródło
Przeglądam dane siatki Script ale nie
generuję wstawki
0

Możesz użyć tego Q2C.SSMSPlugin , który jest darmowy i open source. Możesz kliknąć prawym przyciskiem myszy i wybrać "Wykonaj zapytanie do polecenia ... -> Zapytanie do wstawienia ...". Cieszyć się)

Sergey Petrov
źródło
Czy dotyczy SSMS 2012?
Kiquenet
-1

Możesz użyć INSERT INTO SELECT instrukcji, aby wstawić wyniki zapytania wybierającego do tabeli.http://www.w3schools.com/sql/sql_insert_into_select.asp

Przykład:

INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
Obrońca pierwszy
źródło
1
Nie ma to nic wspólnego z wynikiem konwersji instrukcji SELECT na instrukcje INSERT. To jest po prostu zwykła instrukcja INSERT.
Niels Lucas
Czy nie jest to równoważne funkcjonalnie?
Protector One