我有一个DOS批处理文件,我想用它来调用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
它适用于测试内容,但对于真实内容,我只想将tp的值设置为null,这样它将使用真实的表名,而不是伪造的表名。
我这样做的原因是因为我不知道实际数据库中使用的所有内容的名称。我正在努力使它通用化,这样我就不必对一个非常大的sql程序进行大量的搜索替换(真正的sql程序已经有数百行了)。
在测试用例中,这将解决
select top 10 * into myTESTdatabasename.dbo.TESTdsttbl from myTESTdatabasename.dbo.TESTsrctbl
对于生产运行,它应该解决
select top 10 * into mydatabasename.dbo.dsttbl from mydatabasename.dbo.srctbl
问题似乎是它不喜欢$(tp)的null值,或者可能是它得到了一个未定义的变量。
我对语法进行了一些实验,正如Preet Sangha所指出的,您应该使用/V命令行选项。
原因是在批处理脚本中将变量设置为空字符串会取消定义
如果你想在批处理文件的顶部设置数据库名称,你仍然可以使用set,如下所示:
set db_to_use=
然后,您可以使用/V选项在sqlcmd中使用此(未定义)变量:
sqlcmd -S %svr% -d somename -v db="%db_to_use%" -i test01.sql
或者您可以直接在sqlcmd行中设置值:
sqlcmd -S %svr% -d somename -v db="" -i test01.sql