Làm thế nào để bạn nhập một tệp MS SQL .sql lớn?


240

Tôi sử dụng so sánh dữ liệu SQL RedGate và tạo tệp .sql, vì vậy tôi có thể chạy nó trên máy cục bộ của mình. Nhưng vấn đề là tệp có dung lượng trên 300mb, điều đó có nghĩa là tôi không thể sao chép và dán vì bảng tạm không thể xử lý được và khi tôi cố mở tệp trong SQL Server Management Studio, tôi gặp lỗi về tập tin quá lớn

Có cách nào để chạy một tệp .sql lớn không? Các tập tin cơ bản chứa dữ liệu cho hai bảng mới.

Câu trả lời:


441

Từ dấu nhắc lệnh, khởi động sqlcmd:

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

Chỉ cần thay thế <server>bằng vị trí của hộp SQL và <your file here>tên tập lệnh của bạn. Đừng quên, nếu bạn đang sử dụng một phiên bản SQL, cú pháp là:

sqlcmd -S <server>\instance.

Dưới đây là danh sách tất cả các đối số bạn có thể vượt qua 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
Tôi có một số chèn như : INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text'). Tôi có lỗi với dấu ngoặc kép. SO Tôi phải sử dụng cái gì (tham số nào) để xử lý lỗi này? Cảm ơn
Oleksandr Fentsyk

1
Chúng ta có thể giữ tập lệnh trên ổ đĩa ngoài không? Giống như E: lái xe? thay vì ổ C?
Ani

10
Chỉ cần xác nhận rằng tôi vừa chạy tệp 1 GB sql bằng lệnh này
Loupax

11
Điều này làm việc cho tôi, nhưng tôi đã phải thoát khỏi -o vào cuối
bunggo

2
nó không thể chạy tập tin sql 75G.
Aladdin

62

Tôi đã có cùng một vấn đề và đã phải vật lộn một lúc rồi cuối cùng cũng tìm ra giải pháp là đặt -atham số thành sqlcmdđể thay đổi kích thước gói mặc định của nó:

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

4
+1 để thêm tùy chọn -d trong ví dụ. Tôi đã sử dụng "SỬ DỤNG [DBNAME]" trong tệp sql của mình. Điều này làm việc là tốt. Không chắc chắn phương pháp nào tốt hơn hay được ưa thích
Shaakir

3
Cảm ơn. Tôi đã sử dụng lệnh sau đây là tên người dùng và mật khẩu cần thiết để kết nối với cơ sở dữ liệu. sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
Hriju

1
Vấn đề nào bạn đã giải quyết bằng cách đặt kích thước gói? Microsoft nói: "Kích thước gói lớn hơn có thể tăng cường hiệu suất ..." ( docs.microsoft.com/en-us/sql/tools/sqlcmd-utility )
Ngày

20

Bạn có thể sử dụng công cụ này là tốt. Nó thực sự hữu ích.

BigSqlRunner


Tôi nghĩ rằng nó cũng hữu ích, cho đến khi tôi chạy nó với tệp SQL 400 MB (có đầy đủ các câu lệnh INSERT). Sau khi chạy được 9 giờ, không có gì được thêm vào cơ sở dữ liệu, nhưng BigSqlRunner đã tiêu tốn từ 3 GB đến 6 GB bộ nhớ.
Martijn

Rất hữu ích. Thông thường tôi tự chia tệp (các công cụ khác nhau) thành các khối, sau đó chỉnh sửa thủ công chúng để các câu lệnh sql là "toàn bộ", sau đó thực thi thông qua một tập lệnh bó. Điều này làm cho nó dễ dàng. Tệp 2.3gb .sql, dễ dàng.
Barry

14
  1. Thực hiện nhắc lệnh với đặc quyền quản trị viên

  2. Thay đổi thư mục thành nơi lưu trữ tệp .sql

  3. Thực hiện lệnh sau

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


7

Tôi đang sử dụng MSSQL Express 2014 và không có giải pháp nào phù hợp với tôi. Tất cả họ chỉ bị lỗi SQL. Vì tôi chỉ cần chạy một kịch bản tắt với nhiều câu lệnh chèn đơn giản mà tôi đã khắc phục bằng cách viết một ứng dụng bảng điều khiển nhỏ như một phương sách cuối cùng:

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

Tôi đã có vấn đề tương tự. Tệp của tôi với tập lệnh sql có kích thước hơn 150 MB (với gần 900 nghìn chữ INSERT rất đơn giản ). Tôi đã sử dụng giải pháp được Takuro khuyên dùng (như câu trả lời trong câu hỏi này) nhưng tôi vẫn gặp lỗi với thông báo nói rằng không có đủ bộ nhớ ("Không đủ bộ nhớ hệ thống trong nhóm tài nguyên 'nội bộ' để chạy truy vấn này").

Điều giúp tôi là tôi đã đặt lệnh GO sau mỗi 50k INSERT .

(Nó không trực tiếp giải quyết câu hỏi (kích thước tệp) nhưng tôi tin rằng nó giải quyết vấn đề được kết nối gián tiếp với kích thước lớn của tập lệnh sql. Trong trường hợp của tôi, nhiều lệnh chèn)


1

Câu hỏi của bạn khá giống với câu hỏi này

Bạn có thể lưu tệp / tập lệnh của mình dưới dạng .txt hoặc .sql và chạy nó từ Sql Server Management Studio (Tôi nghĩ menu là Open / Query, sau đó chỉ cần chạy truy vấn trong giao diện SSMS). Bạn phải cập nhật dòng đầu tiên, cho biết cơ sở dữ liệu sẽ được tạo hoặc chọn trên máy cục bộ của bạn.

Nếu bạn phải thực hiện việc truyền dữ liệu này rất thường xuyên, thì bạn có thể tiến hành sao chép. Tùy thuộc vào nhu cầu của bạn, sao chép ảnh chụp có thể ổn. Nếu bạn phải đồng bộ dữ liệu giữa hai máy chủ của mình, bạn có thể sử dụng mô hình phức tạp hơn như sao chép hợp nhất.

EDIT: Tôi không nhận thấy rằng bạn có vấn đề với SSMS được liên kết với kích thước tệp. Sau đó, bạn có thể sử dụng dòng lệnh, như đề xuất của người khác, sao chép ảnh chụp nhanh (xuất bản trên máy chủ chính của bạn, đăng ký trên máy chủ cục bộ của bạn, sao chép, sau đó hủy đăng ký) hoặc thậm chí sao lưu / khôi phục


3
Jack đã đề cập rằng anh ta không thể làm điều đó từ SSMS vì tệp quá lớn.
Ray Booysen

1

Các tập tin cơ bản chứa dữ liệu cho hai bảng mới.

Sau đó, bạn có thể thấy đơn giản hơn khi chỉ DTS (hoặc SSIS, nếu đây là SQL Server 2005+) dữ liệu trên, nếu hai máy chủ nằm trên cùng một mạng.

Nếu hai máy chủ không nằm trên cùng một mạng, bạn có thể sao lưu cơ sở dữ liệu nguồn và khôi phục nó sang cơ sở dữ liệu mới trên máy chủ đích. Sau đó, bạn có thể sử dụng DTS / SSIS, hoặc thậm chí đơn giản INSERT INTO SELECT, để chuyển hai bảng vào cơ sở dữ liệu đích.


Nếu một hoặc hai bảng tạo ra một tệp lớn, có thể giả định rằng DB là một vài Gigs, điều này làm cho việc sao lưu và khôi phục không khả thi trong nhiều trường hợp.
Thuyền trưởng Kenpachi

1

Hy vọng điều này sẽ giúp bạn!

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

1
-U <tên người dùng> -P <password> Các lệnh tùy chọn nên viết hoa chứ không phải chữ thường
eric xu

0

Tôi đã gặp phải vấn đề tương tự và đầu tư cả ngày để tìm lối thoát nhưng điều này được giải quyết bằng cách sao chép tệp .sql và thay đổi phần mở rộng thành tệp .txt và mở tệp .txt vào trình duyệt chrome. Tôi đã thấy phép thuật và tập tin được mở trong một trình duyệt.

Trân trọng cảm ơn,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.