Como faço para que o SSMS use o caminho relativo do script atual com: r no modo sqlcmd como o SSDT?

11

Se eu tiver foo.sql e bar.sql na mesma pasta, foo.sql poderá fazer referência a bar.sql quando executado a partir do SSDT no modo sqlcmd com :r ".\bar.sql". No entanto, o SSMS não o encontrará. Procmon mostra que o SSMS está procurando %systemroot%\syswow64:

Captura de tela do Procmon anotada

Como eu digo ao SSMS para procurar na pasta em que o script atual está salvo sem declarar explicitamente o caminho?

Justin Dearing
fonte

Respostas:

8

Obter um caminho relativo no SSMS não é tão simples, pois você não está executando o script; O SSMS carregou o script na memória e está executando seu texto. Portanto, o diretório / pasta atual é a pasta inicial do processo padrão. Você pode ver isso executando o seguinte no modo SQLCMD no SSMS:

!! PWD

No entanto, eu encontrei um meio meio de fazer isso. Admito que essa não é a maneira mais ideal de fazer isso, no entanto, atualmente parece ser a única maneira de obter um caminho relativo verdadeiro (dado que definir o caminho em uma variável não é realmente "relativo" por si só )

Então, o que você pode fazer é:

  1. Execute um comando do DOS para localizar foo.sql e armazene o caminho para esse arquivo em um arquivo de texto em uma pasta que você pode obter do SSMS, seja por ser um caminho codificado ou por usar uma variável de ambiente disponível para o comando DOS e o modo SQLCMD no SSMS
  2. Ao armazenar o caminho nesse arquivo, armazene-o como um comando no modo SQLCMD que define uma variável para esse caminho
  3. Importe esse arquivo de texto para o SSMS usando :re ele definirá essa variável para o caminho desejado
!! 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:

  • O método acima assume que apenas 1 arquivo no sistema é nomeado foo.sql . Se mais de um arquivo tiver esse nome, o último encontrado será o caminho definido no arquivo relative_path.txt

  • Fazer isso CD C:\será iniciado na raiz da unidade C : . Este provavelmente não é o lugar mais eficiente para começar. Se você geralmente possui seus arquivos SQL em uma área como C: \ Usuários {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , basta alterar o CDcomando para se aproximar do destino, como:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...
Solomon Rutzky
fonte
Isso é criativo, mas é lento e exige muito disco.
Justin Dearing
2
@DustinDearing Como eu disse na minha resposta, é a) não ideal eb) lento se estiver iniciando em um diretório raiz, mas c) a única maneira de ver isso tecnicamente relativa. Não tenho certeza se a indexação do disco rígido removeria o problema de desempenho.
Solomon Rutzky
Embora isso me entristece, essa é definitivamente a melhor resposta que não envolve definir o caminho de outro script de comando ou codificá-lo no arquivo.
precisa
5

Eu posso estar errado, mas não acho que isso seja possível. Por favor, veja estes links para um exemplo do que os outros fizeram (nenhum é o 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
fonte
Bem, ok, isso é péssimo, mas acho que incentiva o uso do SSDT.
Justin Dearing
2

Eu recomendo salvar o arquivo de variáveis ​​sqlcmd em 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' e referenciá-lo de todos os meus projetos como $ (TEMP) \ sqlcmd_variables.sql.

Vernon Jimmerson
fonte