Làm cách nào để SSMS sử dụng đường dẫn tương đối của tập lệnh hiện tại với: r ở chế độ sqlcmd như SSDT không?


11

Nếu tôi có foo.sql và bar.sql trong cùng một thư mục, foo.sql có thể tham chiếu bar.sql khi chạy từ SSDT trong chế độ sqlcmd với :r ".\bar.sql". Tuy nhiên, SSMS sẽ không tìm thấy nó. Procmon cho thấy SSMS đang tìm kiếm %systemroot%\syswow64:

Ảnh chụp màn hình Procmon được chú thích

Làm cách nào để yêu cầu SSMS tìm trong thư mục rằng tập lệnh hiện tại được lưu vào mà không khai báo đường dẫn rõ ràng?

Câu trả lời:


8

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à:

  1. 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
  2. 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 đó
  3. Nhập tệp văn bản đó vào SSMS bằng cách sử dụng :rvà 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 CDlệnh để đến gần đích hơn, chẳng hạn như:

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

Đó là sáng tạo, nhưng để làm chậm và chuyên sâu đĩa.
Justin thân mến

2
@JustinDear Như tôi đã nói trong câu trả lời của mình, đó là một) không lý tưởng và b) chậm nếu bắt đầu từ một thư mục gốc, nhưng c) cách duy nhất tôi có thể thấy để làm điều đó là tương đối về mặt kỹ thuật . Tôi không chắc chắn nếu lập chỉ mục ổ cứng sẽ loại bỏ vấn đề hiệu suất.
Solomon Rutzky 6/2/2015

Mặc dù điều này làm tôi buồn, nhưng đây chắc chắn là câu trả lời tốt nhất không liên quan đến việc thiết lập đường dẫn từ một tập lệnh khác hoặc mã hóa cứng vào tệp.
Queue Hammer

5

Tôi có thể sai, nhưng tôi không nghĩ rằng nó có thể. Vui lòng xem các liên kết này để biết ví dụ về những gì người khác đã làm (không có lý tưởng nào).

/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


Vâng, nó rất tệ, nhưng tôi đoán nó khuyến khích việc sử dụng SSDT.
Justin thân mến

2

Tôi khuyên bạn nên lưu tệp biến sqlcmd của bạn trong 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' và tham chiếu nó từ tất cả các dự án của tôi dưới dạng $ (TEMP) \ sqlcmd_variables.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.