it-swarm.com.de

Ausführen einer sehr großen SQL-Datei

Ich habe eine 830mb .sql Datei, die eine Skript-DB ist.

Ich möchte diese SQL ausführen, damit Daten auf einem gehosteten Server erstellt und in eine Datenbank eingefügt werden. Ich kann es nicht in SQL Server Management Studio oder EMS SQL Manager) öffnen.

Wie kann ich es ausführen?

7
PeteTheGreek

Abhängig von der DB-Variante bieten die meisten Befehlszeilentools zum Laden von SQL-Dateien. Sieht so aus, als würden Sie möglicherweise ms sql verwenden. Referenz hier http://technet.Microsoft.com/en-us/library/ms165702 (v = sql.105) .aspx , genauer http://technet.Microsoft.com/en-us/library/ms170572.aspx

sqlcmd -S myServer\instanceName -i C:\myScript.sql
8
Konstantin

SQLCMD ist eine praktikable Option, aber für ein so großes Skript habe ich noch nie getestet, ob es tatsächlich in der Lage ist, damit umzugehen oder nicht. Außerdem empfehle ich -o logfile.txt als ob etwas schief gehen würde, hätten Sie mindestens eine Protokolldatei, um zu sehen, was schief gelaufen ist.

Folgendes würde ich empfehlen:

Ich habe eine 830 MB SQL-Datei, die eine Skript-DB ist.

Ich denke, Sie haben Ihre gesamte Datenbank zusammen mit Schema und Daten und damit dieser Mammutgröße gescriptet.

Ich möchte diese SQL ausführen, damit Daten auf einem gehosteten Server erstellt und in eine Datenbank eingefügt werden. Ich kann es nicht in SQL Server Management Studio oder EMS SQL Manager) öffnen.

Sie können es nicht über SSMS oder andere GUI-Tools ausführen.

Wie kann ich es ausführen?

Schreiben Sie niemals die gesamte Datenbank mit Daten und Schema aus. Stattdessen -

  1. Schreiben Sie die Datenbank SCHEMA_ONLY aus und erstellen Sie eine leere Datenbank auf dem Zielserver neu.
  2. Verwenden Sie BCP OUT und BULK INSERT, um Daten einzufügen.

Unten finden Sie das Skript, das Ihnen bei Teil 2 hilft.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- save below output in a bat file by executing below in SSMS in TEXT mode
-- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 

select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
        +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.

declare @Destdbname sysname
set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
        +  QUOTENAME(@Destdbname)+ '.'
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
        +  QUOTENAME(name) 
        + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
        +  REPLACE(name,' ','') 
        +'.dat'' 
        with (
        KEEPIDENTITY,
        DATAFILETYPE = ''native'',  
        TABLOCK
        )'  + char(10) 
        + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)
7
Kin Shah

Neben sqlcmd bietet SQL Server das Dienstprogramm osql

Wie sqlcmd wird auch osql im Unterordner Tools\Binn der SQL Server-Installation gespeichert und über die Eingabeaufforderung verwendet

Die Syntax lautet

osql -H <computer_name> -S <instance_name[\instance_name]> -U <username> -P <password> -i <full path to the script> 
  1. Starten Sie die Eingabeaufforderung
  2. Wechseln Sie in den Ordner Tools\Binn
  3. Führen Sie Code wie aus

    osql -H TestServer -S Fujitsu\SQL2012 -i D:\Test\sync.sql -U sa -P sqladmin

Hinweis: Diese Funktion wird in zukünftigen SQL Server-Versionen entfernt

Sie können alle für das Dienstprogramm verfügbaren Argumente hier festlegen: osql Utility

3
Milena Petrovic

Es gibt Tools zum Ausführen großer Skriptdateien. Ich habe gerade diese gefunden: http://bigsqlrunner.codeplex.com/ Es gibt wahrscheinlich Dutzende ähnlicher Anwendungen. Ich habe dieses noch nicht verwendet, aber wenn ich eines schreiben würde, würde es das riesige Skript durchlesen und kleinere SQL-Skripte mit 'GO' als Trennzeichen analysieren und einzeln ausführen.

1
Mike A