路径中的 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 变量有啥区别?