我连接的SQL服务器有很多数据库。
如何查询sysobjects以便在哪个数据库中找到名为“myStoredProcedure”的存储过程?
查询应返回数据库名称。
由于
答案 0 :(得分:3)
我知道你不是要求这个,但我真的为SSMS下载RedGate's Sql Search加载项并使用它。它允许您轻松地在任何数据库上查找任何对象(proc,表,视图,列等)。
它是免费的!
答案 1 :(得分:0)
我试试看:
CREATE TABLE ##DatabaseList
(
DatabaseName varchar(50)
)
EXECUTE SP_MSForEachDB 'USE [?]; INSERT INTO ##DatabaseList SELECT DB_NAME() FROM [sys].[objects] WHERE name = "MyStoredProcedure" AND type_desc = "SQL_STORED_PROCEDURE"'
SELECT * FROM ##DatabaseList
DROP TABLE ##DatabaseList
使用未记录/不支持的系统存储过程SP_MSForEachDb并将任何匹配写入全局临时表,然后在删除表之前将内容输出到“结果”窗口。如果您只需要知道哪个数据库(或数据库 - 当然可能有多个数据库)具有适当命名的SP,则应该这样做。如果你想在其他地方使用输出作为参数,可能需要更多的工作。
顺便说一下,我在过去的几个月里只是自己学习这些东西,所以如果有人能批评上述内容并提出更好的方法,我很乐意收到反馈。同样,我可以尽我所能回答此处发布的任何其他问题。
干杯
答案 2 :(得分:0)
出于好奇,我决定尝试自己编写,特别是因为ADG提到他的解决方案是使用不受支持的无证程序。这也可以扩展为第二个参数,所以它检查type = P(存储过程)你可能会改变它以寻找其他东西,如视图/表等。
我的解决方案有点长,但这里有:
CREATE PROCEDURE spFindProceduresInDatabases
(
@ProcedureName NVARCHAR(99)
)
AS
BEGIN
-- Get all the database names and put them into a table
DECLARE @Db TABLE (DatabaseName Varchar(99))
INSERT INTO @Db SELECT name FROM Sys.databases
-- Declare a table to hold our results
DECLARE @results TABLE (DatabaseName VARCHAR(99))
-- Make a Loop
-- Declare a variable to be incremented
DECLARE @count INT
SET @count = 0
-- Declare the end condition
DECLARE @endCount INT
SELECT @endCount = COUNT(*) FROM @Db
-- Loop through the databases
WHILE (@count < @endCount )
BEGIN
-- Get the database we are going to look into
DECLARE @dbWeAreChecking VARCHAR(99)
SELECT TOP 1 @dbWeAreChecking = DatabaseName FROM @Db
DELETE FROM @Db WHERE DatabaseName = @dbWeAreChecking
-- Create and execute our query
DECLARE @Query NVARCHAR(3000)
SET @Query = N'SELECT @outParam = COUNT(*) FROM '+@dbWeAreChecking+'.sys.sysobjects WHERE type = ''P'' and name = @ProcedureName'
Declare @outParam INT
print (@Query)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @IntVariable INT
SET @ParmDefinition = N'@ProcedureName VARCHAR(99),@outParam INT OUTPUT'
SET @IntVariable = 35
EXECUTE sp_executesql
@Query ,
@ParmDefinition,
@ProcedureName,
@outParam = @outParam OUTPUT
-- If we have a result insert it into the results table
If (@outParam > 0)
BEGIN
INSERT INTO @results(DatabaseName) VALUES(@dbWeAreChecking)
END
-- Increment the counter
SET @count = (@count + 1)
END
-- SELECT ALL OF THE THINGS!!!
SELECT * FROM @results
END