คุณจะนำเข้าไฟล์ MS .sql ขนาดใหญ่ได้อย่างไร


240

ฉันใช้การเปรียบเทียบข้อมูล RedGate SQL และสร้างไฟล์. sql ดังนั้นฉันจึงสามารถเรียกใช้บนเครื่องท้องถิ่นของฉัน แต่ปัญหาคือไฟล์มีขนาดเกิน 300mb ซึ่งหมายความว่าฉันไม่สามารถคัดลอกและวางได้เนื่องจากคลิปบอร์ดไม่สามารถจัดการได้และเมื่อฉันพยายามเปิดไฟล์ใน Studio จัดการเซิร์ฟเวอร์ SQL ฉันได้รับข้อผิดพลาด เกี่ยวกับไฟล์ที่มีขนาดใหญ่เกินไป

มีวิธีเรียกใช้ไฟล์. sql ขนาดใหญ่หรือไม่ ไฟล์นั้นมีข้อมูลสำหรับตารางใหม่สองตาราง

คำตอบ:


442

จากพรอมต์คำสั่งเริ่มต้นsqlcmd:

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

เพียงแทนที่<server>ด้วยตำแหน่งของกล่อง SQL ของคุณและ<your file here>ด้วยชื่อสคริปต์ของคุณ อย่าลืมถ้าคุณใช้อินสแตนซ์ SQL ไวยากรณ์คือ:

sqlcmd -S <server>\instance.

นี่คือรายการของการขัดแย้งทั้งหมดที่คุณสามารถผ่าน sqlcmd:

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
ฉันมีส่วนแทรกดังนี้: INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). ฉันมีข้อผิดพลาดพร้อมคำพูด ดังนั้นฉันต้องใช้อะไร (พารามิเตอร์ใด) เพื่อจัดการข้อผิดพลาดนี้ ขอบคุณ
Oleksandr Fentsyk

1
เราสามารถเก็บสคริปต์ไว้ในไดรฟ์ภายนอกได้หรือไม่? เช่นเดียวกับ E: ขับรถ แทนไดรฟ์ C?
Ani

10
เพิ่งยืนยันว่าฉันเพิ่งรันไฟล์ 1GB sql โดยใช้คำสั่งนี้
Loupax

11
สิ่งนี้ได้ผลสำหรับฉัน แต่ฉันต้องกำจัด -o ในตอนท้าย
bunggo

2
มันล้มเหลวในการเรียกใช้ไฟล์ 75G sql
Aladdin

62

ฉันมีปัญหาเดียวกันอย่างแน่นอนและได้รับการดิ้นรนในขณะที่ในที่สุดก็พบวิธีแก้ปัญหาซึ่งคือการตั้งค่า-aพารามิเตอร์sqlcmdเพื่อเพื่อเปลี่ยนขนาดแพ็คเก็ตเริ่มต้นของมัน:

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

4
+1 สำหรับการเพิ่มตัวเลือก -d ในตัวอย่าง ฉันใช้ "USE [DBNAME]" ในไฟล์ sql ของฉัน สิ่งนี้ใช้ได้เช่นกัน ไม่แน่ใจว่าวิธีไหนดีกว่าหรือดีกว่า
ไหน Shaakir

3
ขอบคุณ ฉันใช้คำสั่งต่อไปนี้เป็นชื่อผู้ใช้และรหัสผ่านที่จำเป็นในการเชื่อมต่อกับฐานข้อมูล sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju

1
คุณแก้ไขปัญหาใดด้วยการตั้งค่าขนาดแพ็คเก็ต Microsoft กล่าวว่า: "ขนาดแพ็คเก็ตที่ใหญ่ขึ้นสามารถเพิ่มประสิทธิภาพ ... " ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
Jan ที่เหลือเชื่อ

20

คุณสามารถใช้เครื่องมือนี้เช่นกัน มันมีประโยชน์จริงๆ

BigSqlRunner


ฉันคิดว่ามันมีประโยชน์เช่นกันจนกระทั่งฉันรันด้วยไฟล์ SQL 400 MB (เต็มไปด้วยคำสั่ง INSERT) หลังจากทำงานเป็นเวลา 9 ชั่วโมงไม่มีอะไรถูกเพิ่มลงในฐานข้อมูล แต่ BigSqlRunner ใช้หน่วยความจำระหว่าง 3 GB ถึง 6 GB
Martijn

มีประโยชน์มาก. ฉันมักจะแบ่งไฟล์ (เครื่องมือต่าง ๆ ) ด้วยตนเองเป็นชิ้นแล้วแก้ไขด้วยตนเองเพื่อให้คำสั่ง sql เป็น "ทั้งหมด" จากนั้นดำเนินการผ่านชุดสคริปต์ ทำให้ง่ายมาก 2.3gb .sql ไฟล์ง่าย
Barry

14
  1. ใช้พรอมต์คำสั่งด้วยสิทธิ์ผู้ดูแลระบบ

  2. เปลี่ยนไดเรกทอรีเป็นที่เก็บไฟล์. sql

  3. ดำเนินการคำสั่งต่อไปนี้

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


7

ฉันใช้ MSSQL Express 2014 และไม่มีวิธีแก้ปัญหาใดที่เหมาะกับฉัน พวกเขาทั้งหมดล้มเหลว SQL เนื่องจากฉันต้องการเรียกใช้สคริปต์เพียงครั้งเดียวโดยมีคำสั่งแทรกง่าย ๆ ฉันได้รับมันโดยการเขียนแอปคอนโซลเล็ก ๆ เป็นทางเลือกสุดท้าย:

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

ฉันมีปัญหาที่คล้ายกัน ไฟล์สคริปต์ sql ของฉันมีขนาดเกินกว่า 150MB (มีขนาดเกือบ 900,000 INSERTง่ายมาก ) ฉันใช้วิธีแก้ปัญหาที่แนะนำโดย Takuro (เป็นคำตอบในคำถามนี้) แต่ฉันยังคงมีข้อผิดพลาดพร้อมข้อความแจ้งว่ามีหน่วยความจำไม่เพียงพอ ("มีหน่วยความจำระบบไม่เพียงพอในพูลทรัพยากร 'ภายใน' เพื่อเรียกใช้แบบสอบถามนี้")

สิ่งที่ช่วยฉันได้คือฉันสั่งGOทุก ๆ 50k INSERT s

(มันไม่ได้ตอบคำถามโดยตรง (ขนาดไฟล์) แต่ฉันเชื่อว่ามันแก้ปัญหาที่เชื่อมต่อทางอ้อมกับสคริปต์ sql ขนาดใหญ่ในกรณีของฉันคำสั่งแทรกหลายคำสั่ง)


1

คำถามของคุณค่อนข้างคล้ายกับคำถามนี้

คุณสามารถบันทึกไฟล์ / สคริปต์เป็น. txt หรือ. sql และเรียกใช้จาก Sql Server Management Studio (ฉันคิดว่าเมนูเป็น Open / Query จากนั้นเพียงเรียกใช้แบบสอบถามในอินเทอร์เฟซ SSMS) คุณ migh ต้องอัปเดตบรรทัดแรกระบุว่าฐานข้อมูลที่จะสร้างหรือเลือกในเครื่องท้องถิ่นของคุณ

หากคุณต้องถ่ายโอนข้อมูลนี้บ่อยครั้งคุณสามารถไปทำซ้ำได้ การจำลองแบบสแน็ปช็อตอาจเป็นไปได้ หากคุณต้องซิงค์ข้อมูลระหว่างเซิร์ฟเวอร์ทั้งสองของคุณคุณสามารถไปหารูปแบบที่ซับซ้อนมากขึ้นเช่นการจำลองแบบผสาน

แก้ไข: ฉันไม่ได้สังเกตว่าคุณมีปัญหากับ SSMS ที่เชื่อมโยงกับขนาดไฟล์ จากนั้นคุณสามารถไปที่บรรทัดคำสั่งตามที่ผู้อื่นเสนอการจำลองแบบสแน็ปช็อต (เผยแพร่บนเซิร์ฟเวอร์หลักของคุณสมัครสมาชิกในเครื่องของคุณทำซ้ำแล้วยกเลิกการสมัคร) หรือแม้กระทั่งการสำรอง / เรียกคืน


3
แจ็คบอกว่าเขาไม่สามารถทำได้จาก SSMS เนื่องจากไฟล์มีขนาดใหญ่เกินไป
Ray Booysen

1

ไฟล์นั้นมีข้อมูลสำหรับตารางใหม่สองตาราง

จากนั้นคุณอาจพบว่าง่ายกว่าเพียง DTS (หรือ SSIS หากเป็น SQL Server 2005+) ข้อมูลมากกว่าหากเซิร์ฟเวอร์สองเครื่องอยู่ในเครือข่ายเดียวกัน

หากเซิร์ฟเวอร์สองเครื่องไม่ได้อยู่ในเครือข่ายเดียวกันคุณสามารถสำรองฐานข้อมูลต้นทางและเรียกคืนไปยังฐานข้อมูลใหม่บนเซิร์ฟเวอร์ปลายทาง จากนั้นคุณสามารถใช้ DTS / SSIS หรือแม้แต่แบบง่าย ๆINSERT INTO SELECTในการถ่ายโอนตารางสองตารางไปยังฐานข้อมูลปลายทาง


หากหนึ่งหรือสองตารางสร้างไฟล์ที่มีขนาดใหญ่จะปลอดภัยที่จะถือว่าฐานข้อมูลเป็นสองกิ๊กซึ่งทำให้การสำรองข้อมูลและกู้คืนเป็นไปไม่ได้ในหลาย ๆ กรณี
กัปตัน Kenpachi

1

หวังว่านี่จะช่วยคุณได้!

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

1
-U <ชื่อผู้ใช้> -P <รหัสผ่าน> คำสั่งตัวเลือกควรเป็นตัวพิมพ์ใหญ่ไม่ใช่ตัวพิมพ์เล็ก
eric xu

0

ฉันพบปัญหาเดียวกันและลงทุนทั้งวันเพื่อหาทางออก แต่ได้รับการแก้ไขโดยการทำสำเนาไฟล์. sql และเปลี่ยนนามสกุลเป็นไฟล์. txt และเปิดไฟล์. txt ลงในเบราว์เซอร์โครม ฉันเคยเห็นความมหัศจรรย์และไฟล์ถูกเปิดในเบราว์เซอร์

ขอขอบคุณและขอแสดงความนับถือ,

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.