我正面临着奇怪的行为。
重现方法如下:在具有多个数据库的实例中(在我的例子中是 SQL Server 2016),创建该存储过程(master
在我的例子中):
create procedure dbo.Strange WITH EXECUTE AS owner
as
begin
exec sp_MSforeachdb 'select''?''';
end;
然后调用该存储过程:
Exec master.dbo.Strange
正如您将看到的,它只会返回部分数据库的数据,而不是全部(在我的例子中是 11 个数据库中的 3 个)。
怎么了?
sp_MSforeachdb 有很多已知问题。
如果您点击该链接,您将看到 Aaron Bertrand 的一篇文章,其中详细介绍了它们,并且还提供了一个替代解决方案。