2

TSQL 프로그램을 호출하는 데 사용할 DOS 배치 파일이 있습니다. 사용할 데이터베이스의 이름을 전달하고 싶습니다. 이것은 작동하는 것 같습니다. 작업하고자하는 테이블의 이름에 대해 PREFIXES를 전달하고 싶습니다. 테스트 테이블의 경우 테스트 테이블을 사용하기 위해 접두사의 이름을 전달하려고합니다.환경 변수를 통해 null 문자열 값을 TSQL 스크립트에 전달

set svr=myserver 
rem set db=myTESTdatabasename 
set db=mydatabasename 
rem set tp=TEST 
set tp= 
sqlcmd -S %svr% -d somename -i test01.sql 

test01.sql은 다음과 같습니다

use $(db) 
go 

select top 10 * into $(db).dbo.$(tp)dsttbl from $(db).dbo.$(tp)srctbl 

그것은 테스트 물건 잘 작동하지만 실제 물건, 난 그냥 그렇게 것이 널 (null)로 TP의 값을 설정하려면 가짜 테이블 이름이 아닌 실제 테이블 이름을 사용하십시오.

내가 이것을하는 이유는 실제 데이터베이스에서 사용될 모든 이름을 모르기 때문입니다. 나는 매우 큰 SQL 프로그램 (실제 SQL 프로그램은 수 백 줄)이 될 것에 대해 많은 검색을 대신 할 필요가 없도록 일반화하려고하고있다. 테스트 케이스에서

, 이것은 생산 실행을 위해

select top 10 * into myTESTdatabasename.dbo.TESTdsttbl from myTESTdatabasename.dbo.TESTsrctbl 

에 해결하는 것, 그것은

select top 10 * into mydatabasename.dbo.dsttbl from mydatabasename.dbo.srctbl 

문제를 해결해야한다는 ($에 대한 null 값을 좋아하지 않는 것 같다 tp), 또는 아마도 그것은 정의되지 않은 변수를 얻고있다.

+1

알 테이블 '이란 뜻이야? dbo 스키마를 의미합니까? 어떤 경우에는 tp = dbo로 설정하십시오. 또한 [스크립트 변수와 함께 sqlcmd 사용] (http://msdn.microsoft.com/en-us/library/ms188714.aspx) :/V 명령 줄 옵션이 작동합니까? –

+0

좋은 질문입니다. 그걸 정리하기 위해 편집하겠습니다. – elbillaf

+0

아마도 이것이 분명합니다. – elbillaf

답변

2

일부 구문을 사용하여 실험했지만 Preet Sangha가 지적했듯이/V 명령 줄 옵션을 사용해야합니다.

이유는 일괄 스크립트 undefines it에서 변수를 빈 문자열로 설정하기 때문입니다. 당신은 아직 할 수있는 배치 파일의 상단에있는 데이터베이스 이름을 설정하려면

과 같이 설정을 사용

set db_to_use= 

그런 다음을 사용하여 SQLCMD이 (정의되지 않은) 변수를 사용할 수 있습니다/V 옵션 :

sqlcmd -S %svr% -d somename -v db="%db_to_use%" -i test01.sql 

... 또는 당신은 단지 SQLCMD 라인에 직접 값을 설정할 수 있습니다

RHE '재를 무엇
sqlcmd -S %svr% -d somename -v db="" -i test01.sql