risposta-alla-domanda-sullo-sviluppo-web-bd.com

Conversione Seleziona i risultati in Insert script - SQL Server

Ho SQL Server 2008, SQL Server Management Studio.

Devo selezionare i dati da Table1 nel database1. Quindi devo modificare alcuni valori nei risultati e insert values into Table1 nel database2. 

O lascia che lo metta in un altro modo. 

Come posso convertire i dati in una tabella in insert script.

67
Captain Comic

SSMS Toolpack (che è FREE come nella birra) ha una serie di grandi caratteristiche - tra cui generare istruzioni INSERT dalle tabelle.

Aggiornamento: per SQL Server Management Studio 2012 (e più recente), SSMS Toolpack non è più gratuito, ma richiede un costo di licenza modesto.

23
marc_s

Ecco un altro metodo, che potrebbe essere più semplice dell'installazione di plugin o strumenti esterni in alcune situazioni:

  • Fai un select [whatever you need]INTO temp.table_namefrom [... etc ...].
  • Fare clic con il tasto destro del mouse sul database in Esplora oggetti => Attività => Genera script
  • Seleziona temp.table_name nella schermata "Scegli oggetti", fai clic su Avanti.
  • Nella schermata "Specificare come gli script devono essere salvati":
    • Fare clic su Avanzate, trovare la proprietà "Tipi di dati su Script", selezionare "Solo dati", chiudere le proprietà avanzate.
    • Seleziona "Salva in una nuova finestra di query" (a meno che tu non abbia migliaia di record).
  • Fare clic su Avanti, attendere il completamento del lavoro, osservare le risultanti istruzioni INSERT visualizzate in una nuova finestra di query.
  • Usa Trova e sostituisci per cambiare tutto [temp.table_name] in [your_table_name].
  • drop table [temp.table_name].
94
KT.

Metodo nativo

per esempio se hai un tavolo 

Users(Id, name)

Puoi farlo:

select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
34
Andrew Orsich

In SSMS:

  • Fare clic con il tasto destro del mouse sul database> Attività> Genera script

  • Il prossimo

  • Seleziona "Seleziona oggetti di database specifici" e controlla la tabella che vuoi script, Avanti

  • Fare clic su Advanced > nell'elenco delle opzioni, scorrere verso il basso e cercare "Tipi di dati da script" e modificarlo in "Solo dati"> OK

  • Seleziona "Salva in una nuova finestra di query"> Avanti> Avanti> Fine

Tutte le 180 righe ora sono scritte come 180 istruzioni di inserimento!

26
tember

1- Spiegazione degli script

A) La sintassi per l'inserimento dei dati nella tabella è la seguente

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

             -- To achieve this part i    
             --have used below variable
                [email protected]_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
[email protected]_DATA---

C) Per ottenere sopra i dati da esistenti tabella dobbiamo scrivere la select interrogare in modo tale che l'output sarà in forma di script di cui sopra

D) Quindi finalmente ho concatenato sopra la variabile per creare lo script finale che sarà generare script di inserimento all'esecuzione

E)

@TEXT='SELECT ''INSERT INTO
 '[email protected]_NAME+'('[email protected]_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '[email protected]_NAME + @FILTER_CONDITION

F) E infine Eseguita la query sopra EXECUTE(TEXT)

G) la funzione QUOTENAME() è utilizzata per il wrap dati della colonna all'interno della citazione

H) ISNULL è usato perché se una riga ha NULL dati per qualsiasi colonna la query fallisce e restituire NULL ecco perché evitare che ho usato ISNULL 

I) E creato lo sp sp_generate_insertscripts per lo stesso

1- Basta inserire il nome della tabella per il quale si desidera insert script

2- Condizione del filtro se si desidera ottenere risultati specifici

----------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 '[email protected]_NAME+'('[email protected]_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '[email protected]_NAME + @FILTER_CONDITION

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

EXECUTE (@TEXT)

SET NOCOUNT OFF

END
8
Param Yadav

È possibile farlo tramite Visual Studio SQL Server Object Explorer.

Puoi fare clic su "Visualizza dati" dal menu di scelta rapida per la tabella necessaria, filtrare i risultati e salvare i risultati come script.

8
BotanMan

Usando Visual Studio, fai quanto segue 

Creare un progetto di tipo SQL Server -> Progetto database SQL Server

apri il server sql Explorer CTL- \, CTL-S 

aggiungere un server SQL facendo clic con il pulsante destro del mouse sull'icona SQL SERVER. Selcet AGGIUNGI NUOVO SERVER

navigare fino al tavolo a cui sei interessato 

tasto destro -> VISUALIZZA DATI

Fare clic sulla cella in alto a sinistra per evidenziare tutto (sembra che ctl-A non funzioni)

Tasto destro -> SCript 

Questo è favoloso. Ho provato tutto quanto elencato sopra nel corso degli anni. So che c'è uno strumento là fuori che farà questo e molto altro, non posso pensare al nome di esso. Ma è molto costoso. 

In bocca al lupo. L'ho appena capito. Non l'ho testato estesamente con i campi di testo, ecc., Ma sembra che ti faccia molta strada lungo la strada. 

Greg

8
greg

Crea una tabella separata usando nella dichiarazione Ad esempio

Seleziona * in Test_123 da [dbo]. [Dipendente] dove Nome come '% Test%'

Vai al Database Clicca con il tasto destro sul DatabaseFai clic su Genera ScriptSeleziona la tua tabellaSeleziona l'opzione advanace e seleziona l'Attributo "Solo Dati" Seleziona il file "apri in una nuova query".

Sql genererà script per te

3
KMR

È possibile scegliere l'opzione "Risultato su file" in SSMS ed esportare il risultato selezionato in un file e apportare le modifiche nel file dei risultati e infine utilizzare BCP - Copia in blocco che è possibile inserire nella tabella 1 nel database 2.

Penso che per l'inserimento di massa devi convertire il file .rpt in file .csv

Spero che ti sarà d'aiuto.

3
Pankaj Agarwal

Questa è una soluzione più versatile (che può fare un po 'di più della domanda) e può essere utilizzata in una finestra di query senza dover creare un nuovo stored proc - utile nei database di produzione, ad esempio dove non si ha accesso in scrittura .

Per utilizzare il codice, si prega di modificare in base ai commenti in linea che spiegano il suo utilizzo. È quindi possibile eseguire questa query in una finestra di query e stamperà le istruzioni INSERT necessarie.

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
2
Neo

È possibile utilizzare un'istruzione INSERT INTO SELECT per inserire i risultati di una query di selezione in una tabella. http://www.w3schools.com/sql/sql_insert_into_select.asp

Esempio:

INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
1
Protector one

Ho avuto un problema simile, ma avevo bisogno di essere in grado di creare un'istruzione INSERT da una query (con filtri, ecc.) 

Così ho creato la seguente procedura:

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..'[email protected]);

    -- 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 '[email protected]
    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

È quindi possibile utilizzarlo scrivendo l'output della query in una tabella temporanea ed eseguendo la procedura:

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

Nota: Questa procedura esegue il cast dei valori su una stringa che può far apparire i dati un po 'diversi. Ad esempio, con DATETIME i secondi andranno persi.

1
JollyBrackets

È possibile utilizzare i pacchetti del servizio di integrazione server Sql specificamente progettati per l'operazione Importa ed esporta

VS ha un pacchetto per lo sviluppo di questi pacchetti se si installa completamente Sql Server.

Integration Services in Business Intelligence Development Studio

1
Jahan Zinedine

Penso che sia anche possibile con le query ad hoc Puoi esportare i risultati in un file Excel e poi importarli nel tuo oggetto datatable o usarlo così com'è e quindi importare il file Excel nel secondo database Dai uno sguardo questo link questo può aiutarti molto.

http://vscontrols.blogspot.com/2010/09/import-and-export-Excel-to-sql-server.html

1
JSJ

È possibile utilizzare questo Q2C.SSMSPlugin , che è gratuito e open source. È possibile fare clic con il tasto destro e selezionare "Esegui query su comando ... -> query da inserire ...". Godere)

0
Sergey Petrov

Se si utilizza Oracle (o si configura l'applicazione su SQL Server), Oracle SQL Developer lo fa per te. scegli 'scarica' per una tabella e segui le opzioni attraverso (deseleziona DDL se non vuoi che tutta la tabella crei roba).

0
Liam

Ho trovato questo SMSMS Boost addon, che è gratuito e fa esattamente questo tra le altre cose. È possibile fare clic con il pulsante destro del mouse sui risultati e selezionare Script data come.

0
DAud

Ho creato il seguente 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

Quindi puoi usarlo in questo modo:

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;

L'output sarebbe qualcosa del genere:

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

Se desideri solo ottenere un intervallo di righe, utilizza il parametro @top come segue:

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;
0
Sorack