Nhận một đường dẫn tương đối trong SSMS không đơn giản vì bạn không thực thi tập lệnh; SSMS đã tải tập lệnh vào bộ nhớ và đang thực thi văn bản của nó. Vì vậy, thư mục / thư mục hiện tại là thư mục bắt đầu quá trình mặc định. Bạn có thể thấy điều này bằng cách chạy như sau trong chế độ SQLCMD trong SSMS:
!! PWD
Tuy nhiên, tôi đã tìm thấy một cách sắp xếp để làm điều này. Tôi thừa nhận rằng đây không phải là cách siêu lý tưởng nhất để làm điều này, tuy nhiên, hiện tại nó dường như là cách duy nhất để có một đường dẫn tương đối thực sự (do việc đặt đường dẫn trong một biến không thực sự "tương đối" mỗi se ).
Vì vậy, những gì bạn có thể làm là:
- Thực thi lệnh DOS để tìm foo.sql và lưu đường dẫn đến tệp đó trong tệp văn bản trong thư mục mà bạn có thể nhận được từ SSMS, vì đó là đường dẫn được mã hóa cứng hoặc vì nó sử dụng biến môi trường có sẵn cho cả lệnh DOS và chế độ SQLCMD trong SSMS
- Khi lưu trữ đường dẫn trong tệp đó, lưu trữ dưới dạng lệnh chế độ SQLCMD đặt biến cho đường dẫn đó
- Nhập tệp văn bản đó vào SSMS bằng cách sử dụng
:r
và nó sẽ đặt biến đó thành đường dẫn mong muốn
!! 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
Ghi chú:
Phương thức trên giả định chỉ có 1 tệp trên hệ thống được đặt tên là foo.sql . Nếu có nhiều hơn một tập tin có tên đó, là tìm thấy cuối cùng sẽ là bộ đường dẫn trong relative_path.txt tập tin
Làm CD C:\
sẽ bắt đầu từ gốc của ổ C : . Đây có lẽ không phải là nơi hiệu quả nhất để bắt đầu. Nếu bạn thường có các tệp SQL của mình trong một khu vực, chẳng hạn như C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Project , thì chỉ cần thay đổi CD
lệnh để đến gần đích hơn, chẳng hạn như:
!! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...