SQL Server / T-SQL có hỗ trợ tiếp tục dòng để ngắt chuỗi dài không?


13

Đôi khi tôi có một tập lệnh SQL có một hoặc nhiều chuỗi siêu dài (đôi khi thậm chí dài ngu ngốc). Thông thường, đây là những VARBINARYchữ / hằng đại diện cho các tệp / Tập hợp, nhưng đôi khi chúng là văn bản.

Vấn đề chính với các chuỗi thực sự dài là một số trình soạn thảo văn bản không xử lý tốt tất cả. Ví dụ: tôi có một VARBINARYnghĩa đen mà tôi sử dụng trong một CREATE ASSEMBLY [AssemblyName] FROM 0x....câu lệnh và bản thân Hội có kích thước chỉ hơn 1 MB, tương đương với chỉ hơn 2 triệu ký tự trong một tệp văn bản vì mỗi byte yêu cầu hai ký tự được thể hiện bằng ký hiệu hex (ví dụ 0x1F= a 1và an F). SQL Server Management Studio (SSMS) không xử lý tốt việc này và bị treo trong vài giây khi tôi cố gắng cuộn qua dòng đó. Và trên thực tế, một số phiên bản (không chắc điều này có xảy ra hay không) thậm chí sẽ hiển thị cảnh báo về các dòng dài khi mở tập lệnh có ít nhất một dòng trên một độ dài nhất định.

Vấn đề thứ yếu là nó làm phức tạp định dạng khi sử dụng trong trình chỉnh sửa mà không bật tính năng ngắt từ hoặc đăng trực tuyến. Vấn đề ở đây là thanh trượt cho thanh cuộn ngang rất hẹp và di chuyển nó dù chỉ một chút thường cuộn văn bản không siêu dài ra khỏi tầm nhìn.

Bây giờ, T-SQL không chấm dứt các lệnh bằng dòng mới hoặc thậm chí là dấu chấm phẩy (mặc dù dấu chấm phẩy được ưu tiên / khuyến nghị, bắt đầu với SQL Server 2005). Vì SQL Server biết cách phân tích từng câu lệnh để nó biết khi nào nó kết thúc, có vẻ như việc chia dòng dài trên nhiều dòng, chỉ được phân tách bằng dấu newline/ carriage-return+ line-feed, có vẻ không hợp lý. Nhưng điều này không hoạt động trong cả hai trường hợp.

PRINT 'Line1
Line2';

trả về (trong tab "Tin nhắn"):

Line1
Line2

Và điều đó có ý nghĩa đủ vì dòng mới nằm trong một nghĩa đen / hằng số. Nhưng làm điều này cho một VARBINARYcũng không làm việc.

PRINT 0x1234
5678;

cho tôi một lỗi

Câu trả lời:


13

Rất may, có sự hỗ trợ cho việc tiếp tục dòng trong T-SQL thông qua \ký tự (dấu gạch chéo ngược). Chỉ cần đặt nó ở cuối dòng, ngay trước newline/ carriage-return+ line-feedvà dòng mới sẽ bị bỏ qua.

Đối với chuỗi văn bản, điều này hoạt động như sau:

PRINT 'Line1\
Line2';

trả về (trong tab "Tin nhắn"):

Line1Line2

Đối với chuỗi nhị phân / hex, điều này hoạt động như sau:

PRINT 0x1234\
5678;

trả về (trong tab "Tin nhắn"):

0x12345678;

Để định dạng các tệp nhị phân (Tập hợp, Chứng chỉ) thành các chuỗi hex-byte văn bản để sử dụng trong các tập lệnh SQL, tôi đã viết một tiện ích dòng lệnh có tên BinaryFormatter mà tôi đã phát hành dưới dạng nguồn mở trên GitHub. Nó không chỉ chuyển đổi tệp nhị phân thành biểu diễn văn bản mà còn sử dụng tính năng tiếp tục dòng để truyền bá các VARBINARYchữ dài trên nhiều hàng cần thiết, dựa trên số lượng ký tự được chỉ định để sử dụng cho mỗi hàng. Kết quả là một cái gì đó dọc theo dòng:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

Sau đó tôi sao chép và dán vào tập lệnh của mình, như được hiển thị trong {...}khu vực bên dưới:

CREATE ASSEMBLY [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

Để biết thêm chi tiết về chủ đề này, vui lòng xem bài đăng trên blog của tôi: Tiếp tục dòng trong T-SQL

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.