sp_msforeachdb在后台如何工作?


9

我需要解决我遇到的问题,并且需要一些帮助来了解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%''

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

注意事项。

  • 它是唯一一个以数字开头的数据库
  • 我可以尝试使用“如果数据库像'%61%'那样不要执行......”之类的代码,但是仍然会出现相同的错误。
  • 我无法测试更改数据库名称的情况-与之连接的东西太多了。
  • 如果我创建一个以“ 51”开头的测试数据库,那么我也会得到该数据库的错误

我该如何克服?

Answers:


16

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

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

EXEC sp_helptext sp_msforeachdb

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

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

括号将列出您提到的特定问题。但是,如果数据库中包含[或],则会遇到问题。


有趣的是,在“?”周围使用方括号 在完成工作。我将研究Aaron Bertrand的版本。您是否注意到由于游标导致的性能显着下降?
Jeff.Clark

2
当行数多时,游标只是一个实际的性能问题。除非您接近允许的最大数据库数,否则您不会看到问题。问题在于它可以跳过数据库。阅读亚伦的文章,他会更详细。
肯尼斯·费舍尔

1
我已经看到它不止一次完全跳过数据库。使用亚伦(Aaron),更可靠。
克里斯·格鲁特迈耶

11

我不同意@Kenneth所说的任何观点,我应该指出,您遇到的错误与无关sp_MSForEachDB。这是由于数据库的命名方式:它以数字开头。MSDN页面上的“ 数据库标识符”中详细介绍了命名对象(不仅是数据库)的规则。如果您遵循“常规标识符规则”,则无需将这些名称括在方括号或双引号中。但是那年秋天的那些规则之外的名称需要被封闭(总是)。


1
也感谢您提供此信息-我不知道该限制。不幸的是,这个数据库是在我加入公司十年之前建立的:)
Jeff.Clark

@ Jeff.Clark我并不是建议您按照无法更改数据库的问题重命名数据库。我只是想让您(和其他人)知道实际的问题,因为无论何时您需要在任何地方指定该数据库名称,它都会再次出现。阅读完整的规则集可以帮助您避免其他需要名称的事情-数据库,表,列,索引,约束等-始终用方括号或双引号引起来。
所罗门·鲁兹基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.