ฉันสามารถเปิดใช้งานโหมด SQLCMD จากภายในสคริปต์ได้หรือไม่


17

มีคำสั่งที่ฉันสามารถใช้ในสคริปต์เพื่อบังคับให้ SSMS เปิดใช้งาน / ปิดใช้งานโหมด SQLCMD หรือไม่

คำตอบ:


17

อย่างที่บอกไปแล้วว่ามันไม่มีทาง

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

:setvar DatabaseName "MyDatabase"
GO
IF ('$(DatabaseName)' = '$' + '(DatabaseName)')
    RAISERROR ('This script must be run in SQLCMD mode. Disconnecting.', 20, 1) WITH LOG
GO
-- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors
IF @@ERROR != 0
    SET NOEXEC ON
GO

PRINT 'You will not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

มีเหตุผลที่ใช้ความรุนแรง 20 มันมีแนวโน้มที่จะฆ่าการเชื่อมต่อทันทีป้องกันรหัสสคริปต์ใด ๆ เพิ่มเติมจากการทำงานแม้ว่าจะมีตัวGOยุติแบทช์ในสคริปต์ในภายหลัง

ความรุนแรง 20-24 :

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

ข้อความแสดงข้อผิดพลาดในช่วงนี้อาจส่งผลกระทบต่อกระบวนการทั้งหมดที่เข้าถึงข้อมูลในฐานข้อมูลเดียวกันและอาจระบุว่าฐานข้อมูลหรือวัตถุเสียหาย ข้อความแสดงข้อผิดพลาดที่มีระดับความรุนแรงตั้งแต่ 19 ถึง 24 จะถูกเขียนไปยังบันทึกข้อผิดพลาด


สำหรับ ssms 2 บรรทัดแรกจะเพียงพอและสำหรับ sql 2000 Query Analyzer ใช้งานได้ แต่ข้อความไม่ปรากฏขึ้น
bernd_k

แต่สคริปต์จะไม่ดำเนินการต่อจาก GO ถัดไปหรือไม่
Dan Nolan

ฉันใช้ SSMS 2008 R2 และมี 2 สายการผลิต: Meldung 102, Ebene 15, สถานะ 1, Zeile 1 ไวยากรณ์ที่ไม่ถูกต้องใกล้กับ ':' การใช้ตัววิเคราะห์คำถาม SQL Server 2000 คุณต้องใช้ RAISERROR
bernd_k

4
ตามที่กล่าวไว้ในที่นี้คุณสามารถตั้งSET NOEXEC ONเป็นมาตรการความปลอดภัยเพิ่มเติมเพื่อป้องกันสิ่งอื่นใดในสคริปต์จากการทำงาน
Yahoo Serious

อืมนี่คือการใช้โหมด SQLCMD เพื่อตรวจสอบว่าโหมด SQLCMD เปิดอยู่หรือไม่ ... ฉันพูดได้ว่ามันจะทำงานไม่ถูกต้องเมื่อโหมด SQLCMD ปิดอยู่เช่น @bernd_k อย่างไรก็ตามหาก: setvar ถูกลบ / แทนที่สำหรับ SQL มันจะทำงานได้
Oak_3260548

7

เลขที่

แต่คุณสามารถเรียกใช้ในโหมด SQLCMD ได้ตลอดเวลาและมี T-SQL ไว้ในนั้น

ในการสร้างความแตกต่างที่ชัดเจนระหว่างคำสั่ง SQLCMD และ Transact-SQL คำสั่ง SQLCMD ทั้งหมดจะต้องนำหน้าด้วยโคลอน (:)


ยังคงใช้งานได้กับ SQL Server 2012/2014/2016 หรือไม่
John aka hot2use

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