我有一个 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) 的空值,或者可能是它得到了一个 undefined variable 。
最佳答案
我尝试了一些语法,正如 Preet Sangha 指出的那样,您应该使用/V 命令行选项。
原因是在批处理脚本中将变量设置为空字符串 undefines it .
如果您想在批处理文件的顶部设置数据库名称,您仍然可以使用 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
关于t-sql - 通过环境变量将空字符串值传递给 TSQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738574/