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.