2008-09-26 3 views
5

t SQL에서 상대 경로를 얻는 방법은 무엇입니까? 예를 들어, .sql 파일은 D : \ temp 폴더에 있으며, hello.txt 파일의 경로를 D : \ temp \ App_Data 폴더로 가져 오려고합니다. 상대 경로 참조를 사용하는 방법?t SQL의 상대 경로?

SQL 서버 관리 스튜디오에서 SQL 파일을 실행한다고 가정 해 보겠습니다.

+0

저장 프로 시저에서 수행하지 않습니까? –

+0

예, 저장 프로 시저 내에서 수행하려고합니다. – Graviton

+0

.sql 파일의 내용이 포함 된 파일에 대해 알지 못합니다. 즉, '위치'를 모르는 것입니다. 상대 경로를 결정하거나 구성 할 수 없습니다. –

답변

3

서버가 t-sql을 실행 중입니다. 클라이언트가 파일을로드 한 위치를 알 수 없습니다. 스크립트 내에 경로를 삽입해야합니다.

DECLARE @RelDir varchar(1000) 
SET @RelDir = 'D:\temp\' 
... 

은 아마 당신은 프로그래밍 .SQL 스크립트 파일 내에서 SET 명령으로 경로를 배치 할 수 있습니다, 또는 아마 당신은 SQLCMD 사용하고 변수로에서 상대적인 디렉토리를 전달할 수 있습니다.

6

.sql 파일은 단지 파일입니다. 그것은 자신의 위치에 대한 어떤 감각도 가지고 있지 않습니다. 파일의 위치, 파일의 위치를 ​​알 수있는 파일입니다 (지정하지 않았습니다).

내가 App_Data 폴더를 언급 했으므로 ASP.NET이 관련되어 있다고 생각합니다. 당신이 당신의 웹 응용 프로그램에서 상대 경로를 사용하려는 경우, 참조 MapPath를

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx

3

T-SQL이 실행 할 때, 그 Management Studio를 실행하는 클라이언트 컴퓨터에서 서버에 일괄 적으로 실행 (또는 다른 SQL 클라이언트). 클라이언트는 .sql 파일의 텍스트 내용을 실행할 서버로 보냅니다. 따라서 해당 파일이 데이터베이스 서버에 있지 않으면 SQL 스크립트에서이 파일과 상호 작용할 수 있을지 의심 스럽습니다.

1

t-sql 스크립트는 먼저 클라이언트 측에서 QueryAnalyzer, SSMS 또는 sqlcmd에 의해 사전 처리됩니다. 이 프로그램은 localcation 파일을 인식하며 Oeacle sqlplus와 비슷한 상대 pathes를 쉽게 처리 할 수 ​​있습니다.

분명히 이것은 마이크로 소프트의 설계 결정 일 뿐이며, 오히려 어리석은 말을합니다.

0

잘 마이크로 소프트 일이 아니야. 업계 표준 일이야. 두 번째 상대 경로로 T-SQL을 실행하기위한 솔루션이 경로 문을 삽입하는 배치 스크립트 또는 무언가를 사용하는 IE이다

@echo OFF 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t-SQL.SQL"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    set RunLocation=%~dp0 
    echo(%~dp0!var! > newsql.sql 
    ENDLOCAL 
) 
sqlcmd newsql.sql 

이나 뭐 그런 어쨌든

+0

그 창을 청소 해 주셔서 고마워요. :) –

4

나는 비슷한 문제가 있었다처럼, % CD % 의사 변수와 함께 sqlcmd 변수를 사용하여 해결했습니다. 시행 착오를 거쳐 모든 부분을 결합했습니다. 그러나 결국 모든 것을 작동 시켰습니다. 이 예제에서는 script.sql 파일이 runscript.bat과 같은 디렉터리에 있어야합니다.

runscript.bat

sqlcmd -S .\SQLINSTANCE -v FullScriptDir="%CD%" -i script.sql -b 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 
0

내가 mateuscb의 의견에서 방법을 시도했다. 나는 그것이 작동하지 않는다는 것을 발견했다, 나는 이유를 모른다, 그 다음 나는 몇 가지 테스트 후에 관리했다. 는 아래의 스크립트를 사용하여 작업 할 수 있습니다

runscript.bat

@set FullScriptDir=%CD% 
sqlcmd -S .\SQLINSTANCE -i script.sql 

script.sql 그냥 추가 논의에 대한 정보를

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 

.