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


11

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

주석이 달린 Procmon

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

답변:


8

스크립트를 실행하지 않기 때문에 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 ...

창의적이지만 느리고 디스크를 많이 사용합니다.
— 저스틴 친애하는

2
@JustinDearing 내 대답에서 말했듯이 a) 비 이상적이며 b) 루트 디렉토리에서 시작하면 느리지 만 c) 기술적 으로 상대적으로 볼 수있는 유일한 방법 입니다. 하드 드라이브를 인덱싱하여 성능 문제가 해결되는지 확실하지 않습니다.
— Solomon Rutzky

이것이 나를 슬프게하지만, 이것은 다른 명령 스크립트의 경로를 설정하거나 파일로 하드 코딩하는 것을 포함하지 않는 가장 좋은 대답입니다.
— QueueHammer


2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.