sp_msforeachdb 在幕后究竟是如何工作的?

Jef*_*ark 9 sql-server stored-procedures t-sql

我需要解决我遇到的问题,我需要一些帮助来了解 sp_msforeachdb 的工作原理以解决我的问题。

每次运行 sp_msforeachdb 时都会发生错误 Msg 102, Level 15, State 1, Incorrect syntax near '61'

我的代码示例如下:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''
Run Code Online (Sandbox Code Playgroud)

但是,我将什么查询作为 sp_msforeachdb 的参数并不重要。每次我都遇到同样的错误。我确实有一个以“61s1d”开头的数据库,所以我认为它的数据库名称有问题,但老实说,我不知道 sp_msforeachdb 的幕后情况。

注意事项。

  • 它是唯一以数字开头的数据库
  • 我可以尝试使用类似“如果数据库就像 '%61%' 不要做......”这样的代码,但仍然是同样的错误。
  • 我无法测试更改数据库名称——连接到它的东西太多。
  • 如果我创建一个以“51”开头的测试数据库,那么我也会收到该数据库的错误

我怎样才能克服这个问题?

Ken*_*her 17

首先不要使用 sp_msforeachdb 它有几个已知问题。您最好在此处此处使用 Aaron Bertrand 的版本。

但是它使用游标、动态 SQL 和替换。您实际上可以使用 sp_helptext 查看代码。

EXEC sp_helptext sp_msforeachdb
Run Code Online (Sandbox Code Playgroud)

如果您使用此代码,它将解决您的一些问题。

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''
Run Code Online (Sandbox Code Playgroud)

括号将是您提到的具体问题。但是,如果您有一个包含 [ 或 ] 的数据库,则会遇到问题。

  • 当您有不止几行时,游标只是一个真正的性能问题。除非您接近允许的最大数据库数量,否则您不会看到问题。问题是它可以跳过数据库。阅读 Aaron 的文章,他会更详细地介绍。 (2认同)

Sol*_*zky 11

不反对@Kenneth 所说的任何内容,我应该指出您遇到的错误与sp_MSForEachDB. 这是由于数据库的命名方式:它以数字开头。命名对象(不仅仅是数据库)的规则在数据库标识符的 MSDN 页面中有详细说明。如果您遵循“常规标识符规则”,则不需要将这些名称括在方括号或双引号中。但是,不属于这些规则的名称确实需要(始终)括起来。