【问题标题】:Conditionally trigger :CONNECT statement SQL有条件触发:CONNECT语句SQL
【发布时间】:2017-04-25 03:02:29
【问题描述】:

注 1:从我目前的研究中看到,没有办法完成我想做的事情,但我希望我错了......

注意 2:这样做的目的是消除更改查询到不同数据库之间的连接的需要

我正在编写一个 SQL 脚本(在 SSMS 中)以根据 ID 号查找信息。此查询可以针对 2 个数据库运行(一个测试数据库和一个生产数据库)。 id 号将在测试数据库或生产数据库中,但不能同时在两者中。我想做的是在 SQLCMD 模式下使用 :CONNECT 语句(或另一种方法,但我还没有找到)连接到适当的数据库。像这样:

:CONNECT /*Testing database name*/
IF NOT EXISTS (SELECT * FROM /*appropriate table*/ WHERE ID = @ID)
    :CONNECT /*Production database name*/

/*Continue with the rest of the query*/

理论上,上面的代码将确保我连接到正确的数据库(假设 ID 完全存在)。但不断发生的是第二个 :CONNECT 语句无论 IF EXISTS 为何都会激活,从而导致查询始终针对生产运行。

有没有办法实现这个目标?提前谢谢!

【问题讨论】:

  • 这不起作用,因为IF NOT EXISTS 是 T-SQL 语句,而 :CONNECT 是 SQLCMD 语句。这些是不相关的:SQLCMD 由 SSMS 解析器执行,而 T-SQL 由数据库执行。由于 SQLCMD 没有条件逻辑,因此您无法在 SQLCMD 脚本中执行您想要执行的操作。如果数据库位于同一实例上,请使用 USE(T-SQL 命令)而不是 :CONNECT。如果它们位于不同的实例上,则无法从 SSMS 执行此操作。您必须使用适当的参数在外部调用 sqlcmd

标签: sql sql-server ssms sqlcmd


【解决方案1】:

由于我不知道您需要什么来消除连接更改,您是否考虑过加入这两个表并从那里着手获得所需的结果?如果这是所需的流程,您可以检查返回表中是否存在 id。

您也可以查看this。 如果有帮助,请告诉我!

【讨论】: