Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2008 tạo trình hướng dẫn tập lệnh cung cấp cho tôi một tập lệnh dẫn đến dấu ngoặc kép không được đóng

Giải pháp cho vấn đề nhập máy chủ SQL

Điều kiện trước

Để di chuyển dữ liệu từ SQL Server này sang SQL Server khác (ví dụ:từ môi trường Sản xuất sang môi trường Kiểm tra), bạn nên sử dụng tính năng "Tạo tập lệnh" có sẵn trong các tùy chọn cơ sở dữ liệu trong SQL Server Management Studio. Kết quả của thao tác này là tệp văn bản với các lệnh SQL có thể được thực thi trên SQL Server khác. Thông thường các tệp này quá lớn để thực thi chúng trong SQL Server Management Studio, vì vậy chúng tôi cần sử dụng sqlcmd tiện ích dòng lệnh từ gói cài đặt SQL Server. Trong hầu hết các trường hợp, tiện ích hoạt động trơn tru và người dùng không cần thực hiện các hành động bổ sung.

Mô tả vấn đề

Trong một số trường hợp hiếm hoi, sqlcmd tiện ích có thể không thành công với việc nhập và xuất hiện lỗi sau:"Dấu ngoặc kép không được đóng sau chuỗi ký tự ..." cho biết rằng một trong các truy vấn SQL chưa được thực thi. Điều này xảy ra bởi vì sqlcmd hoạt động bằng cách sử dụng xử lý luồng, tức là nó đọc một số phần dữ liệu, xử lý nó, đọc phần tiếp theo, v.v. Trong một số trường hợp, tệp đầu vào có thể chứa lệnh SQL lớn có kích thước lớn hơn lượng dữ liệu có thể được xử lý bởi sqlcmd tại một thời điểm, vì vậy sqlcmd cố gắng thực thi SQL bị hỏng và không thành công.

Các giải pháp khả thi

Để khắc phục sự cố này, bạn có thể sử dụng 2 phương pháp:

  • sqlcmd tiện ích có thể chấp nhận tham số "-a" xác định kích thước tối đa của gói (phần dữ liệu) sẽ được sử dụng trong quá trình xử lý. Giá trị tối đa là 32767, giá trị mặc định là 4096, vì vậy bạn nên luôn sử dụng thông số này với giá trị lớn nhất.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Nếu cách tiếp cận đầu tiên không hữu ích và sự cố vẫn xuất hiện, có một giải pháp khác, khó khăn hơn:

    • Cài đặt Cygwin
      • Trong khi cài đặt, sau một số màn hình tiêu chuẩn, hãy dừng lại trên màn hình "Chọn gói"
      • Trong trường "Tìm kiếm", hãy nhập "sed" và trong cây bên dưới, hãy mở rộng danh mục "Cơ sở" và chọn phiên bản không nhỏ hơn 4.2.2 để cài đặt
      • Hoàn tất cài đặt
      • Lưu ý:"sed" là tiện ích Linux cho phép xử lý tệp dựa trên luồng
    • Sau khi cài đặt xong, hãy chạy "Cygwin64 Terminal" từ máy tính để bàn. Chúng tôi sẽ sử dụng nó cho các bước tiếp theo
    • Đi tới thư mục chứa tệp SQL được tạo bởi SQL Server Management Studio. Bạn cần sử dụng dấu gạch chéo kiểu Linux "/" thay vì kiểu Windows là "\"

        cd d:/temp
      
    • Thay đổi mã hóa của tệp SQL từ UTF-16LE thành UTF-8, vì "sed" không thể xử lý UTF-16LE, chuyển đổi này an toàn cho dữ liệu. Kết quả sẽ là một tệp mới mà chúng ta sẽ sử dụng trong bước tiếp theo

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Chuyển đổi tệp mới, để có một truy vấn SQL trong một lô. Kết quả sẽ là một tệp mới mà chúng ta sẽ sử dụng trong bước tiếp theo

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Bây giờ tệp "input_utf8_adapted.sql" sẽ được xử lý bởi sqlcmd mà không gặp bất kỳ sự cố nào, vì vậy chúng tôi có thể thực thi như sau:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Sau khi thực hiện xong, vui lòng kiểm tra import_log.txt để đảm bảo rằng không có lỗi nào xuất hiện



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Cách xác định xem ngày tháng ngày chứa 29,30 hay 31

  2. Tham số đầu ra máy chủ PHP Sql

  3. ddmmyyyy thành sql datetime trong SQL

  4. SQL chạy Biến +1 cho đến khi Biến đạt 52?

  5. Truy vấn được tham số hóa ..... yêu cầu tham số '@units', không được cung cấp