如何查找名为'myStoredProcedure'的存储过程在哪个数据库中?
如何确定存储过程'myStoredProcedure'存储在哪个数据库中?
在好奇心的驱使下,我决定自己尝试编写这个存储过程,尤其是因为ADG提到他的解决方案使用了一个不受支持、未记录的过程。这个解决方案还可以扩展,通过添加第二个参数来检查类型= P(存储过程),你可以改变它来查找其他东西,比如视图/表等等。
我的解决方案有点冗长,但是下面是代码:
CREATE PROCEDURE spFindProceduresInDatabases
(
@ProcedureName NVARCHAR(99)
)
AS
BEGIN
-- 获取所有数据库的名称,并将它们放入一个表中
DECLARE @DatabaseNames TABLE (DatabaseName Varchar(99))
INSERT INTO @DatabaseNames SELECT name FROM Sys.databases
-- 声明一个存储结果的表
DECLARE @Results TABLE (DatabaseName VARCHAR(99))
-- 声明一个变量用于递增
DECLARE @Counter INT
SET @Counter = 0
-- 声明结束条件
DECLARE @EndCondition INT
SELECT @EndCondition = COUNT(*) FROM @DatabaseNames
-- 循环遍历数据库
WHILE (@Counter < @EndCondition)
BEGIN
-- 获取要查找的数据库
DECLARE @CurrentDatabase VARCHAR(99)
SELECT TOP 1 @CurrentDatabase = DatabaseName FROM @DatabaseNames
DELETE FROM @DatabaseNames WHERE DatabaseName = @CurrentDatabase
-- 创建并执行查询
DECLARE @Query NVARCHAR(3000)
SET @Query = N'SELECT @Count = COUNT(*) FROM '+ @CurrentDatabase +'.sys.sysobjects WHERE type = ''P'' and name = @ProcedureName'
Declare @Count INT
print @Query
DECLARE @Params NVARCHAR(500)
DECLARE @Definition INT
SET @Params = N'@ProcedureName VARCHAR(99), @Count OUTPUT'
SET @Definition = 35
EXECUTE sp_executesql @Query, @Params, @ProcedureName, @Count OUTPUT
-- 如果有结果,将其插入结果表中
If (@Count > 0)
BEGIN
INSERT INTO @Results (DatabaseName) VALUES(@CurrentDatabase)
END
-- 递增计数器
SET @Counter = (@Counter + 1)
END
-- 查询所有的结果!!!
SELECT * FROM @Results
END
这个解决方案有点过度,使用了兼容视图。-1,因为它不值得点赞。
这段代码是通过使用未记录/不支持的系统存储过程SP_MSForEachDb,在一个全局临时表中写入任何匹配项,然后将内容输出到结果窗口,最后删除表来尝试找到存储过程名为'myStoredProcedure'的数据库。如果只想知道哪个数据库(或数据库,可能会有多个)有一个名为SP的存储过程,这段代码可以实现。如果想将输出用作参数传递到其他地方,可能需要进行一些额外的工作。
通过使用上述代码,我们可以找到存储过程名为'myStoredProcedure'的数据库。代码首先创建一个名为##DatabaseList的临时表,然后使用SP_MSForEachDB存储过程在所有数据库中查找名为'myStoredProcedure'的存储过程,并将结果插入到临时表中。最后,通过SELECT语句从临时表中检索结果,并在结果窗口中显示。最后,删除临时表。
这段代码的出现原因可能是需要在多个数据库中查找特定的存储过程,但不知道它在哪个数据库中。解决方法是使用SP_MSForEachDb存储过程在所有数据库中查找,并将结果插入到临时表中,然后从临时表中检索结果。