首页 > 解决方案 > 替代动态 sql 和 for each loop

问题描述

我需要针对同一源数据库的 5 个不同实例(每个诊所 1 个)执行相同的选择语句,并将结果集合并在一起以进行进一步处理。我负责维护的现有脚本为每个循环执行一次(每个实例 1 次迭代),并在每次迭代的 select 语句中替换数据库名称。目前,数据库名称是通过从 master 中选择 dbs 获得的,其中名称在 'db 1, db2, db3, db4, db5' 中。

我更喜欢保存一个包含每个数据库名称的参考表和一个标志,以确定它们是否被包含在内。但是对于每个循环是否有替代方案?

标签: sqlsql-server-2014

解决方案


因此,您有 5 个不同的诊所,每个诊所都有一个名称为:db1、db2、db3、db4、db5 的数据库。

并且数据库名称都存储在一个字符串变量中,如“db1、db2、db3、db4、db5”,然后您可以将其用作数组来对数据库名称进行排序。

当然,处理所有这些不同的数据库似乎很笨重,但看起来事情就是这样其他数据库。

至少循环没有使用像这样的简单迭代:

For i = 1 to 5
    strDBName = "db" & i
Next

使用 i 进行迭代的一个问题是,如果诊所 2 不再处于活动状态,因此不应再使用 db2,该怎么办。当然,如果添加了一个新诊所,则需要将“For i = 1 to 5”全部更改为“For i = 1 to 6”。

因此,考虑到上述更糟糕的做事方式,我有点喜欢当前的方式(字符串变量中的数据库名称,可以作为数组循环)。对我来说,可能“持有一个包含每个数据库名称的参考表和一个标志是否包含它们”的想法似乎是一种很好的方式来做你已经在做的事情,而且我个人完全赞成“保持简单”和“如果它没有坏就不要修理它。”

编辑:
但我越是考虑它采取你的“持有一个包含每个数据库名称的参考表和一个是否包含它们的标志”的想法并运行它一点点以下看起来确实很自然(但当然可能是确保只有管理员用户才能看到有关特定数据库的任何字段):

具有以下字段的诊所表:
ClinicID
ClinicName
ClinicAddress
ClinicDBName - 注意可以在此处存储数据库名称
ClinicIsInactive


推荐阅读