SQL Server / T-SQL รองรับความต่อเนื่องของบรรทัดเพื่อแยกสตริงที่ยาวหรือไม่?


13

บางครั้งฉันมีสคริปต์ SQL ที่มีอย่างน้อยหนึ่งสตริงที่ยาวเป็นพิเศษ (บางครั้งก็ยิ่งยาว) โดยทั่วไปสิ่งเหล่านี้เป็นVARBINARYตัวอักษร / ค่าคงที่ที่เป็นตัวแทนของไฟล์ / แอสเซมบลี แต่บางครั้งพวกเขาก็เป็นข้อความ

ปัญหาหลักของสายอักขระที่ยาวมาก ๆ คือตัวแก้ไขข้อความบางตัวไม่สามารถจัดการได้ทั้งหมด ตัวอย่างเช่นฉันมีVARBINARYตัวอักษรที่ฉันใช้ในCREATE ASSEMBLY [AssemblyName] FROM 0x....คำสั่งและแอสเซมบลีตัวเองมีขนาดเพียง 1 MB ซึ่งเท่ากับเพียง 2 ล้านอักขระในไฟล์ข้อความเนื่องจากแต่ละไบต์ต้องการอักขระสองตัวที่จะแสดงในรูปแบบเลขฐานสิบหก (เช่น0x1F= a 1และ an F) SQL Server Management Studio (SSMS) จัดการได้ไม่ดีและค้างนานหลายวินาทีในขณะที่ฉันพยายามเลื่อนข้ามบรรทัดนั้น และในความเป็นจริงแล้วบางเวอร์ชั่น (ไม่แน่ใจว่ายังคงเกิดขึ้น) จะแสดงคำเตือนเกี่ยวกับบรรทัดยาวเมื่อเปิดสคริปต์ที่มีอย่างน้อยหนึ่งบรรทัดในระยะเวลาที่กำหนด

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

ตอนนี้ T-SQL จะไม่ยกเลิกคำสั่งด้วยบรรทัดใหม่หรือแม้แต่เซมิโคลอน (แม้ว่าเซมิโคลอนนั้นจะเป็นที่ต้องการ / แนะนำโดยเริ่มจาก SQL Server 2005) ดังนั้นเนื่องจาก SQL Server รู้วิธีแยกแต่ละคำสั่งเพื่อให้รู้เมื่อสิ้นสุดมันจึงดูเหมือนว่าการแบ่งบรรทัดยาวข้ามหลายบรรทัดโดยคั่นด้วย a newline/ carriage-return+ line-feedเท่านั้นดูเหมือนจะไม่มีเหตุผล แต่นี่ไม่ได้ผลในทั้งสองกรณี

PRINT 'Line1
Line2';

ส่งคืน (ในแท็บ "ข้อความ"):

Line1
Line2

และนั่นก็สมเหตุสมผลพอที่บรรทัดใหม่จะอยู่ภายในตัวอักษร / ค่าคงที่ แต่การทำเช่นนี้สำหรับ a VARBINARYยังไม่ทำงาน

PRINT 0x1234
5678;

ทำให้ฉันมีข้อผิดพลาด

คำตอบ:


13

โชคดีที่มีการรองรับความต่อเนื่องของบรรทัดใน T-SQL ผ่านทาง\อักขระ (แบ็กสแลช) เพียงวางที่ท้ายบรรทัดตรงหน้าnewline/ carriage-return+ line-feedและขึ้นบรรทัดใหม่จะถูกละเว้น

สำหรับสตริงข้อความสิ่งนี้จะทำงานดังนี้:

PRINT 'Line1\
Line2';

ส่งคืน (ในแท็บ "ข้อความ"):

Line1Line2

สำหรับสตริงไบนารี / ฐานสิบหกสิ่งนี้จะทำงานดังนี้:

PRINT 0x1234\
5678;

ส่งคืน (ในแท็บ "ข้อความ"):

0x12345678;

เพื่อจัดรูปแบบไฟล์ไบนารี (แอสเซมบลีใบรับรอง) ลงในสตริง hex-byte ข้อความสำหรับใช้ในสคริปต์ SQL ฉันเขียนยูทิลิตีบรรทัดคำสั่งชื่อBinaryFormatterที่ฉันเปิดใช้เป็นโอเพ่นซอร์สบน GitHub ไม่เพียง แต่แปลงไฟล์ไบนารี่เป็นการแสดงข้อความเท่านั้น แต่ยังใช้การต่อเนื่องของบรรทัดเพื่อกระจายVARBINARYตัวอักษรที่ยาวตามต้องการอีกหลายแถวตามจำนวนอักขระที่ระบุที่จะใช้ต่อแต่ละแถว ผลที่ได้คือบางสิ่งตามแนวของ:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

ซึ่งฉันคัดลอกและวางลงในสคริปต์ของฉันดังที่แสดงใน{...}พื้นที่ด้านล่าง:

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

สำหรับรายละเอียดเพิ่มเติมในหัวข้อนี้โปรดดูโพสต์บล็อกของฉัน: Line-Continuation ใน T-SQL

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