ฉันจะให้ SSMS ใช้เส้นทางสัมพัทธ์ของสคริปต์ปัจจุบันด้วย: r ในโหมด sqlcmd เหมือนกับ SSDT ได้อย่างไร


11

ถ้าผมมี foo.sql และ bar.sql ในโฟลเดอร์เดียวกัน foo.sql สามารถอ้างอิง bar.sql เมื่อเรียกใช้จาก SSDT ในโหมด sqlcmd :r ".\bar.sql"กับ อย่างไรก็ตาม SSMS จะไม่พบ Procmon แสดงให้เห็นว่า SSMS กำลังมองหาใน%systemroot%\syswow64:

ภาพหน้าจอ Procmon ที่มีคำอธิบายประกอบ

ฉันจะบอก SSMS ให้ดูในโฟลเดอร์ที่บันทึกสคริปต์ปัจจุบันไว้โดยไม่ต้องแจ้งเส้นทางอย่างชัดเจนได้อย่างไร

คำตอบ:


8

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

!! PWD

อย่างไรก็ตามฉันหาวิธีทำแบบนี้ได้ ฉันยอมรับว่านี่ไม่ใช่วิธีที่ยอดเยี่ยมที่สุดในการทำเช่นนี้อย่างไรก็ตามในขณะนี้ดูเหมือนจะเป็นวิธีเดียวที่จะได้รับเส้นทางสัมพัทธ์ที่แท้จริง (เนื่องจากการตั้งค่าเส้นทางในตัวแปรไม่ใช่ "ญาติ" ต่อ se )

ดังนั้นสิ่งที่คุณสามารถทำได้คือ:

  1. ดำเนินการคำสั่ง DOS เพื่อค้นหาfoo.sqlและจัดเก็บพา ธ ไปยังไฟล์นั้นในไฟล์ข้อความในโฟลเดอร์ที่คุณได้รับจาก SSMS ไม่ว่าจะเป็นเส้นทางฮาร์ดโค้ดหรือใช้ตัวแปรสภาพแวดล้อมที่มีให้ ทั้งคำสั่ง DOS และโหมด SQLCMD ใน SSMS
  2. เมื่อเก็บเส้นทางในไฟล์นั้นให้จัดเก็บเป็นคำสั่งโหมด SQLCMD ที่ตั้งค่าตัวแปรให้กับเส้นทางนั้น
  3. นำเข้าไฟล์ข้อความนั้นไปยัง SSMS โดยใช้:rและมันจะตั้งค่าตัวแปรนั้นให้เป็นเส้นทางที่ต้องการ
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S foo.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\bar.sql

หมายเหตุ:

  • วิธีการดังกล่าวจะถือว่าเพียง 1 ไฟล์ในระบบการตั้งชื่อfoo.sql หากมีมากกว่าหนึ่งไฟล์ที่มีชื่อนั้นไฟล์ล่าสุดที่พบจะเป็นพา ธ ที่ตั้งค่าในไฟล์relative_path.txt

  • การทำCD C:\จะเริ่มต้นที่รูทของไดรฟ์C: นี่อาจไม่ใช่จุดเริ่มต้นที่มีประสิทธิภาพที่สุด หากคุณมีไฟล์ SQL ของคุณอยู่ในพื้นที่เช่นC: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projectsจากนั้นให้เปลี่ยนCDคำสั่งเพื่อให้เข้าใกล้ปลายทางมากขึ้นเช่น:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...

นั่นคือความคิดสร้างสรรค์ แต่จะช้าและเข้มข้นของดิสก์
Justin Dearing

2
@JustinDearing ตามที่ฉันพูดในคำตอบของฉันมันเป็น) ไม่เหมาะและ b) ช้าถ้าเริ่มต้นจากไดเรกทอรีราก แต่ c) วิธีเดียวที่ฉันจะเห็นว่ามันเป็นความสัมพันธ์ทางเทคนิค ฉันไม่แน่ใจว่าการจัดทำดัชนีฮาร์ดไดรฟ์จะลบปัญหาเรื่องประสิทธิภาพหรือไม่
โซโลมอน Rutzky

แม้ว่าสิ่งนี้ทำให้ฉันเศร้า แต่นี่เป็นคำตอบที่ดีที่สุดที่ไม่เกี่ยวข้องกับการตั้งค่าพา ธ จากสคริปต์คำสั่งอื่นหรือการเข้ารหัสฮาร์ดโค้ดลงในไฟล์
QueueHammer

5

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

/programming/8753541/how-to-get-the-relative-path-of-file-in-sqlcmd-mode-in-ssms

http://boardreader.com/thread/Specifying_relative_path_to_r_command_in_lmlz__f0c78408-e001-48a2-8369-338c9534f496.html


โอเคที่แย่มาก แต่ฉันคิดว่ามันสนับสนุนการใช้งาน SSDT
Justin Dearing

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