Büyük bir MS SQL .sql dosyasını nasıl alırsınız?


240

RedGate SQL veri karşılaştırma kullanın ve bir .sql dosyası oluşturdu, bu yüzden yerel makinemde çalıştırabilir. Ancak sorun, dosyanın 300mb üzerinde olması, yani panonun işleyemeyeceği için kopyalayıp yapıştıramıyorum ve SQL Server Management Studio'da dosyayı açmaya çalıştığımda bir hata alıyorum dosyanın çok büyük olması hakkında.

Büyük bir .sql dosyasını çalıştırmanın bir yolu var mı? Dosya temel olarak iki yeni tablo için veri içerir.

Yanıtlar:


442

Komut isteminden başlatın sqlcmd:

sqlcmd -S <server> -i C:\<your file here>.sql 

Sadece yerine <server>SQL kutusunun konumu ile ve <your file here>senaryonuzun adıyla. Bir SQL örneği kullanıyorsanız sözdizimi şöyledir:

sqlcmd -S <server>\instance.

Sqlcmd iletebileceğiniz tüm argümanların listesi:

Sqlcmd            [-U login id]          [-P password]
  [-S server]            [-H hostname]          [-E trusted connection]
  [-d use database name] [-l login timeout]     [-t query timeout] 
  [-h headers]           [-s colseparator]      [-w screen width]
  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
  [-c cmdend]            [-L[c] list servers[clean output]]
  [-q "cmdline query"]   [-Q "cmdline query" and exit] 
  [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]        [-z new password]
  [-f  | i:[,o:]] [-Z new password and exit] 
  [-k[1|2] remove[replace] control characters]
  [-y variable length type display width]
  [-Y fixed length type display width]
  [-p[1] print statistics[colon format]]
  [-R use client regional setting]
  [-b On error batch abort]
  [-v var = "value"...]  [-A dedicated admin connection]
  [-X[1] disable commands, startup script, environment variables [and exit]]
  [-x disable variable substitution]
  [-? show syntax summary] 

1
Ben gibi bazı eke sahip: INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). Alıntılarla ilgili hata var. SO Bu hatayı işlemek için ne kullanmam gerekir (hangi parametre)? Teşekkürler
Oleksandr Fentsyk

1
Betiği harici sürücüde tutabilir miyiz? E gibi: sürmek? C sürücüsü yerine?
Ani

10
Sadece bu komutu kullanarak 1GB'lık bir sql dosyası çalıştırdığımı onaylıyorum
Loupax

11
Bu benim için çalıştı, ama sonunda -o kurtulmak zorunda kaldı
bunggo

2
75G sql dosyası çalıştırılamadı.
Aladdin

62

Ben tamamen aynı sorunu vardı ve bir süredir mücadele vardı sonra nihayet varsayılan paket boyutunu değiştirmek için -aparametre ayarlamak için çözüm bulundu sqlcmd:

sqlcmd -S [servername] -d [databasename] -i [scriptfilename] -a 32767

4
Örneğe -d seçeneğini eklemek için +1. Sql dosyamda "KULLANIM [DBNAME]" kullandım. Bu da işe yaradı. Hangisinin daha iyi veya tercih edilen yöntem olduğundan emin değilim
Shaakir

3
Teşekkürler. Veritabanına bağlanmak için gereken kullanıcı adı ve parola olarak aşağıdaki komutu kullandım. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju

1
Paket boyutunu ayarlayarak hangi sorunu çözdünüz? Microsoft diyor ki: "Daha büyük bir paket boyutu performansı artırabilir ..." ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
İnanılmaz Ocak

20

Bu aracı da kullanabilirsiniz. Gerçekten faydalı.

BigSqlRunner


400 MB SQL dosyasıyla (INSERT ifadeleriyle dolu) çalışana kadar da yararlı olduğunu düşündüm. 9 saat çalıştıktan sonra veritabanına hiçbir şey eklenmemişti, ancak BigSqlRunner 3 GB ile 6 GB arasında bellek tüketiyordu.
Martijn

Çok kullanışlı. Genellikle el ile dosya (çeşitli araçlar) parçalar halinde bölün, sonra sql deyimleri "bütün" olacak şekilde elle düzenleyin, sonra bir toplu komut dosyası ile yürütmek. Bu çok kolay. 2.3 gb .sql dosyası, kolay.
Barry

14
  1. Yönetici ayrıcalığı ile komut istemi al

  2. .Sql dosyasının saklandığı dizini değiştirin

  3. Aşağıdaki komutu yürütün

    sqlcmd -S 'your server name' -U 'user name of server' -P 'password of server' -d 'db name'-i script.sql


7

MSSQL Express 2014 kullanıyorum ve hiçbir çözüm benim için çalışmadı. Hepsi sadece SQL çöktü. Ben sadece çok basit ekleme ifadeleri ile bir kapalı komut dosyası çalıştırmak için gerekli olduğu gibi ben son çare olarak küçük bir konsol uygulaması yazarak etrafında var:

class Program
{
    static void Main(string[] args)
    {
        RunScript();
    }

    private static void RunScript()
    {
        My_DataEntities db = new My_DataEntities();

        string line;

        System.IO.StreamReader file =
           new System.IO.StreamReader("c:\\ukpostcodesmssql.sql");
        while ((line = file.ReadLine()) != null)
        {
            db.Database.ExecuteSqlCommand(line);
        }

        file.Close();
    }
}


2

Benzer bir sorun yaşadım. Sql betiği olan dosya 150MB'ın üzerinde bir boyuta sahipti (neredeyse 900k çok basit INSERT ile ). Takuro tarafından önerilen çözümü kullandım (bu sorunun cevabı olarak) ama yine de yeterli bellek olmadığını söyleyen bir mesajla hata aldım ("Kaynak havuzunda 'dahili' bu sorguyu çalıştırmak için yetersiz sistem belleği var").

Bana yardımcı olan her 50k INSERT s sonra GO komut koymak oldu .

(Bu doğrudan soru (dosya boyutu) adresleme değil ama dolaylı olarak sql komut dosyasının kendisi büyük boyutu ile bağlantılı sorunu çözdüğüne inanıyorum. Benim durumumda birçok ekleme komutları)


1

Sorunuz oldukça benzer bu bir

Dosyanızı / komut dosyanızı .txt veya .sql olarak kaydedebilir ve Sql Server Management Studio'dan çalıştırabilirsiniz (Bence menü Open / Query'dir, ardından sorguyu SSMS arabiriminde çalıştırın). Yerel makinenizde oluşturulacak veya seçilecek veritabanını gösteren ilk satırı güncellemeniz gerekebilir.

Bu veri aktarımını çok sık yapmanız gerekiyorsa, çoğaltmaya gidebilirsiniz. İhtiyaçlarınıza bağlı olarak, anlık görüntü çoğaltma tamam olabilir. Verileri iki sunucunuz arasında senkronize etmeniz gerekiyorsa, birleştirme çoğaltması gibi daha karmaşık bir model kullanabilirsiniz.

DÜZENLEME: Dosya boyutuna bağlı SSMS ile ilgili sorunlarınız olduğunu fark etmedim. Daha sonra komut satırı için, başkaları tarafından önerildiği gibi, anlık görüntü çoğaltma (ana sunucunuzda yayınlama, yerel olanınızda abone olma, çoğaltma, sonra abonelikten çıkma) veya hatta yedekleme / geri yükleme için gidebilirsiniz


3
Jack, dosya çok büyük olduğundan SSMS'den yapamayacağını belirtti.
Ray Booysen

1

Dosya temel olarak iki yeni tablo için veri içerir.

Daha sonra, iki sunucu aynı ağ üzerindeyse, verileri yalnızca DTS (veya SQL Server 2005+ ise SSIS) vermeyi daha kolay bulabilirsiniz.

İki sunucu aynı ağda değilse, kaynak veritabanını yedekleyebilir ve hedef sunucudaki yeni bir veritabanına geri yükleyebilirsiniz. Sonra INSERT INTO SELECTiki tabloyu hedef veritabanına aktarmak için DTS / SSIS veya hatta bir basit kullanabilirsiniz.


Bir veya iki tablo büyük bir dosya oluşturuyorsa, DB'nin birkaç Gigs olduğunu varsaymak güvenlidir, bu da yedekleme ve geri yüklemeyi birçok durumda olanaksız kılar.
Kaptan Kenpachi

1

Umarım bu yardım eder!

sqlcmd -u UserName -s <ServerName\InstanceName> -i U:\<Path>\script.sql

1
-U <kullanıcı adı> -P <parola> Seçenek komutları büyük harf olmamalıdır
eric xu

0

Aynı sorunla karşılaştım ve çıkış yolunu bulmak için bir gün yatırım yaptım, ancak bu .sql dosyasının kopyasını yaparak .txt dosyasının uzantısını değiştirip .txt dosyasını krom tarayıcıya açarak çözüldü. Sihri gördüm ve dosya bir tarayıcıda açıldı.

Teşekkür ve saygılarımla,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.