【问题标题】:Passing null string value via environment variable to TSQL script通过环境变量将空字符串值传递给 TSQL 脚本
【发布时间】:2023-03-09 06:39:01
【问题描述】:

我有一个 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 值,或者它得到了一个未定义的变量。

【问题讨论】:

  • “真实桌子”是什么意思?你的意思是dbo模式。在这种情况下,只需设置 tp=dbo。还有Use sqlcmd with Scripting Variables:/V 命令行选项有效吗?
  • 好问题。让我编辑以清除它。
  • 也许这更清楚。
  • /V "tp=" 有帮助吗?
  • 啊,我错过了评论的那一部分。我会试试的。

标签: tsql environment-variables sqlcmd dereference null-string


【解决方案1】:

我尝试了一些语法,正如 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

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2020-03-05
    • 2021-06-28
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多