Bagaimana cara mendapatkan SSMS untuk menggunakan jalur relatif skrip saat ini dengan: r dalam mode sqlcmd seperti yang dilakukan SSDT?

11

Jika saya memiliki foo.sql dan bar.sql di folder yang sama, foo.sql dapat mereferensikan bar.sql ketika dijalankan dari SSDT dalam mode sqlcmd with :r ".\bar.sql". Namun, SSMS tidak akan menemukannya. Procmon menunjukkan SSMS mencari %systemroot%\syswow64:

Tangkapan layar Procmon beranotasi

Bagaimana cara memberi tahu SSMS untuk melihat di folder tempat skrip saat ini disimpan tanpa menyatakan secara eksplisit path?

Justin Dearing
sumber

Jawaban:

8

Mendapatkan jalur relatif dalam SSMS tidak semudah itu karena Anda tidak menjalankan skrip; SSMS telah memuat skrip ke dalam memori dan mengeksekusi teksnya. Jadi direktori / folder saat ini adalah proses awal folder awal. Anda dapat melihat ini dengan menjalankan yang berikut ini dalam mode SQLCMD di SSMS:

!! PWD

Namun, saya memang menemukan cara yang agak agak untuk melakukan ini. Saya akui bahwa ini bukan cara super-paling ideal untuk melakukan ini, namun, saat ini tampaknya menjadi satu-satunya cara untuk mendapatkan path relatif yang sebenarnya (mengingat bahwa menetapkan path dalam variabel tidak benar-benar "relatif" per se ).

Jadi yang dapat Anda lakukan adalah:

  1. Jalankan perintah DOS untuk menemukan foo.sql dan simpan path ke file itu dalam file teks dalam folder yang bisa Anda dapatkan dari SSMS, baik karena itu adalah lintasan kode keras atau karena ia menggunakan variabel lingkungan yang tersedia untuk perintah DOS dan mode SQLCMD dalam SSMS
  2. Saat menyimpan path dalam file itu, simpan sebagai perintah mode SQLCMD yang menetapkan variabel ke path itu
  3. Impor file teks itu ke dalam SSMS menggunakan :rdan itu akan mengatur variabel itu ke jalur yang diinginkan
!! 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

Catatan:

  • Metode di atas mengasumsikan hanya 1 file pada sistem bernama foo.sql . Jika lebih dari satu file memiliki nama itu, yang terakhir ditemukan adalah path yang ditetapkan dalam file relative_path.txt

  • Melakukan hal itu CD C:\akan dimulai dari root drive C : . Ini mungkin bukan tempat yang paling efisien untuk memulai. Jika Anda umumnya memiliki file SQL di area seperti C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , maka ubah saja CDperintah untuk lebih dekat ke tujuan, seperti:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...
Solomon Rutzky
sumber
Itu kreatif, tetapi untuk memperlambat dan intensif disk.
Justin Dearing
2
@JustinDearing Seperti yang saya katakan dalam jawaban saya, ini adalah a) tidak ideal, dan b) lambat jika dimulai dari direktori root, tetapi c) satu-satunya cara saya bisa melihat untuk melakukannya secara teknis relatif. Saya tidak yakin apakah pengindeksan hard drive akan menghapus masalah kinerja.
Solomon Rutzky
Meskipun ini membuat saya sedih, ini jelas merupakan jawaban terbaik yang tidak melibatkan pengaturan path dari skrip perintah lain atau pengodean keras ke file.
QueueHammer
5

Saya bisa saja salah, tetapi saya pikir itu tidak mungkin. Silakan lihat tautan ini untuk contoh tentang apa yang telah dilakukan orang lain (tidak ada yang ideal).

/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

SQL Hammer
sumber
Baiklah ok itu menyebalkan, tapi saya kira itu mendorong penggunaan SSDT.
Justin Dearing
2

Saya sarankan menyimpan file variabel sqlcmd Anda di 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' dan merujuknya dari semua proyek saya sebagai $ (TEMP) \ sqlcmd_variables.sql.

Vernon Jimmerson
sumber