路径中的 SQLCMD 变量

Posted

技术标签:

【中文标题】路径中的 SQLCMD 变量【英文标题】:SQLCMD variable in path 【发布时间】:2016-09-15 09:20:39 【问题描述】:

我正在使用一些我希望可重用的 SQL 脚本,例如我需要使用一些变量。

我有一个用 sqlcmd 运行 sql 脚本的 bat 脚本

sqlcmd -S <SERVER> -v PROJECT="<PROJECTNAME>" -i .\start.sql

在 start.sql 脚本中,我执行另一个 sql 脚本,如下所示:

:r .\<PROJECTNAME>\init.sql

所以我已经硬编码了变量的值,并且效果很好。我想使用变量本身,但我无法让它工作。

:r .\$(PROJECT)\init.sql

这里的最后一行是我认为可行的。我已经通过这样做测试打印出变量 PROJECT 中的值:

PRINT '$(PROJECT)'

这给了我变量的值。

希望任何人都可以帮助我使用该变量来执行文件夹中的脚本。

提前致谢。

编辑: PRINT $(PROJECT) 给出以下错误消息:在此上下文中不允许使用名称“XXX”。有效表达式是常量、常量表达式和(在某些情况下)变量。不允许使用列名。

XXX = 变量的值。

【问题讨论】:

使用PRINT $(PROJECT)(没有单引号)会得到什么? 你怎么知道它不起作用?你收到错误信息了吗?还是应该发生的事情没有发生?如果是这样 - 什么? 不,就是这样,如果我使用 :r .\$(PROJECT)\init.sql 它只是跳过它而没有任何消息。但是将 $(PROJECT) 切换为 te 变量值,它会运行另一个脚本。 你怎么知道它刚刚跳过它?发生了什么/没有发生什么?这是您正在使用的有效语法 - 我过去自己做过。 尝试将“print 'hello!';”行放在 init.sql 的顶部。它会被打印出来吗?如果没有,您在 init.sql 中还有其他 sqlcmd 位吗?也许那里有什么干扰? 【参考方案1】:

我做了一个小实验,因为我知道在此之前我已经设法获得类似于此的语法来为我工作。我发现如果我复制你所做的,我会得到以下错误:

发生了致命的脚本错误。 在为“:r”命令指定的路径中找不到目录。

如果相反,我将整个路径放入变量中 - 它可以工作。因此,尝试将您的 .sql 文件更改为:

:r $(PROJECT_FILE_NAME)

并像这样从 SQLCMD 调用它:

sqlcmd -S <SERVER> -v PROJECT_FILE_NAME=".\<PROJECTNAME>\init.sql" -i .\start.sql

当我采用这种方法时,它运行文件init.sql 没有任何错误。

【讨论】:

我也试过了,如果我在变量中传递完整路径,它工作正常,但在这种情况下我不想这样做。我找到了另一个关于如何在 sqlcmd 中连接变量的解决方案。 :r ".\"$(PROJECT)"\register.sql" 这是此论坛帖子social.msdn.microsoft.com/Forums/sqlserver/en-US/… 上的标记答案

以上是关于路径中的 SQLCMD 变量的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2012 数据库项目 - 文件路径配置

SQL Server 数据库项目属性中的本地和默认 SQLCMD 变量有啥区别?

部署 DacPac 时如何在 SqlPackage.exe 中使用多个 SQLCMD 变量?

使用批处理执行 sql cmd

Sql 脚本批量添加资源过大无法加载

如何在预脚本中更改 SSDT SQLCMD 变量?