SSDMS와 같이 sqlcmd 모드에서 SSMS가 현재 스크립트의 상대 경로를 : r과 함께 사용하도록하려면 어떻게해야합니까? SSDT에서 sqlcmd 모드의으로 실행할

동일한 폴더에 foo.sql과 bar.sql이있는 경우 foo.sql은 SSDT에서 sqlcmd 모드의으로 실행할 때 bar.sql을 참조 할 수 있습니다 :r ".\bar.sql". 그러나 SSMS는 찾지 못합니다. Procmon은 SSMS가 다음을 찾고 있음을 보여줍니다 %systemroot%\syswow64.

주석이 달린 Procmon

경로를 명시 적으로 선언하지 않고 SSMS에 현재 스크립트가 저장된 폴더를 찾도록하려면 어떻게해야합니까?



답변

스크립트를 실행하지 않기 때문에 SSMS에서 상대 경로를 얻는 것은 그리 간단하지 않습니다. SSMS가 스크립트를 메모리에로드하고 해당 텍스트를 실행 중입니다. 따라서 현재 디렉토리 / 폴더가 기본 프로세스 시작 폴더입니다. SSMS의 SQLCMD 모드에서 다음을 실행하여이를 확인할 수 있습니다.

!! PWD

그러나 나는 이것을 할 수있는 약간의 방법을 찾았습니다. 나는 이것이 가장 이상적인 이상적인 방법은 아니라는 것을 인정하지만, 현재 진정한 상대 경로 를 얻는 유일한 방법 인 것 같습니다 (변수에서 경로를 설정하는 것이 실제로 “상대적”이 아닌 경우) ).

그래서 당신이 할 수있는 일은 :

  1. DOS 명령을 실행하여 foo.sql 을 찾고 해당 파일의 경로를 텍스트 파일에 SSMS에서 가져올 수있는 폴더의 텍스트 파일에 저장하십시오. 하드 코딩 된 경로이거나 사용 가능한 환경 변수를 사용하기 때문입니다. SSMS에서 DOS 명령과 SQLCMD 모드
  2. 해당 파일에 경로를 저장할 때 변수를 해당 경로로 설정하는 SQLCMD 모드 명령으로 저장하십시오.
  3. 를 사용하여 해당 텍스트 파일을 SSMS로 가져 오면 :r해당 변수를 원하는 경로로 설정합니다.
!! 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

노트:

  • 위의 방법은 시스템의 파일 하나만 foo.sql 이라고 가정 합니다. 둘 이상의 파일에 해당 이름이있는 경우 마지막으로 찾은 파일 은 relative_path.txt 파일에 설정된 경로입니다.

  • 지내요 CD C:\의 루트에서 시작됩니다 C : 드라이브를. 이곳은 시작하기에 가장 효율적인 장소는 아닙니다. 일반적으로 C : \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects 와 같은 영역에 SQL 파일이있는 경우 CD명령을 변경하여 다음 과 같이 대상에 더 가깝게하십시오.

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

답변

나는 틀릴 수는 있지만 가능하다고 생각하지 않습니다. 다른 사람들이 한 일에 대한 예는이 링크를 참조하십시오.

/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


답변

sqlcmd 변수 파일을 ‘C : \ Users \ your_nt_login_name \ AppData \ Local \ Temp’에 저장하고 모든 프로젝트에서 $ (TEMP) \ sqlcmd_variables.sql로 참조하는 것이 좋습니다.


답변