¿Cómo consigo que SSMS use la ruta relativa del script actual con: r en modo sqlcmd como lo hace SSDT?


11

Si tengo foo.sql y bar.sql en la misma carpeta, foo.sql puede hacer referencia a bar.sql cuando se ejecuta desde SSDT en modo sqlcmd con :r ".\bar.sql". Sin embargo, SSMS no lo encontrará. Procmon muestra que SSMS está buscando %systemroot%\syswow64:

Captura de pantalla de Procmon anotada

¿Cómo le digo a SSMS que busque en la carpeta en la que se guarda el script actual sin declarar explícitamente la ruta?

Respuestas:


8

Obtener una ruta relativa en SSMS no es tan sencillo ya que no está ejecutando el script; SSMS ha cargado el script en la memoria y está ejecutando su texto. Por lo tanto, el directorio / carpeta actual es la carpeta de inicio del proceso predeterminado. Puede ver esto ejecutando lo siguiente en modo SQLCMD en SSMS:

!! PWD

Sin embargo, encontré una forma un poco más o menos de hacer esto. Admito que esta no es la forma más ideal de hacer esto, sin embargo, actualmente parece ser la única forma de obtener una ruta relativa verdadera (dado que establecer la ruta en una variable no es realmente "relativa" per se )

Entonces, lo que puedes hacer es:

  1. Ejecute un comando de DOS para buscar foo.sql y almacenar la ruta a ese archivo en un archivo de texto en una carpeta que puede obtener de SSMS, ya sea porque es una ruta codificada o porque usa una variable de entorno que está disponible para tanto el comando DOS como el modo SQLCMD en SSMS
  2. Al almacenar la ruta en ese archivo, almacénelo como un comando de modo SQLCMD que establece una variable en esa ruta
  3. Importe ese archivo de texto en SSMS usando :ry establecerá esa variable en la ruta deseada
!! 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

Notas:

  • El método anterior supone que solo 1 archivo en el sistema se llama foo.sql . Si más de un archivo tiene ese nombre, el último encontrado será la ruta establecida en el archivo relative_path.txt

  • Hacer CD C:\esto comenzará en la raíz de la unidad C:. Probablemente este no sea el lugar más eficiente para comenzar. Si generalmente tiene sus archivos SQL en un área como C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , simplemente cambie el CDcomando para acercarse al destino, como:

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

Eso es creativo, pero lento e intensivo en disco.
Justin Dearing

2
@JustinDearing Como dije en mi respuesta, es a) no ideal, yb) lento si se inicia desde un directorio raíz, pero c) la única forma en que puedo ver que es técnicamente relativa. No estoy seguro si indexar el disco duro eliminaría el problema de rendimiento.
Solomon Rutzky

Aunque esto me entristece, esta es definitivamente la mejor respuesta que no implica establecer la ruta desde otro script de comando o codificarlo en el archivo.
QueueHammer


2

Recomiendo guardar su archivo de variables sqlcmd en 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' y hacer referencia a él desde todos mis proyectos como $ (TEMP) \ sqlcmd_variables.sql.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.