0
我错过了一个名为Select_Customer
的存储过程。我有很多版本的相同的数据库,我不能真正记得程序的位置。我如何搜索多个数据库来查找对象?在多个数据库中搜索
我错过了一个名为Select_Customer
的存储过程。我有很多版本的相同的数据库,我不能真正记得程序的位置。我如何搜索多个数据库来查找对象?在多个数据库中搜索
存储过程sp_databases
列出了服务器中的所有数据库。正在执行:
CREATE TABLE #d (
DATABASE_NAME VARCHAR(255),
DATABASE_SIZE INT, REMARKS NVARCHAR(MAX)
)
INSERT INTO #d EXEC sp_databases
会给你一个包含所有数据库名称的表。
接下来的表[DATABASE NAME].sys.procedures
包含数据库中所有存储过程的列表。
因此,您需要打开一个游标,列出服务器中的所有数据库,然后使用动态SQL在每个数据库中按名称查找存储过程。希望你能填写详细内容:)
好的;我已经填写了你的详细信息
IF OBJECT_ID('[FindStoredProcOnServer]') IS NOT NULL
DROP PROCEDURE [FindStoredProcOnServer]
GO
CREATE PROCEDURE [FindStoredProcOnServer]
@storedProcName VARCHAR(255),
@databaseName VARCHAR(255) OUTPUT,
@debug BIT = 0
AS
BEGIN
DECLARE @err BIT
DECLARE @sql NVARCHAR(MAX)
DECLARE @params NVARCHAR(MAX)
DECLARE @exists BIT
CREATE TABLE #output (DATABASE_NAME VARCHAR(255))
CREATE TABLE #d (
DATABASE_NAME VARCHAR(255),
DATABASE_SIZE INT,
REMARKS NVARCHAR(MAX)
)
INSERT INTO #d EXEC sp_databases
DECLARE dbCursor CURSOR FOR SELECT DATABASE_NAME FROM #d
OPEN dbCursor
SET @params = '@exists BIT OUTPUT'
FETCH NEXT FROM dbCursor INTO @databaseName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = '
SELECT
@exists = COUNT(*)
FROM
[' + @databaseName + '].sys.procedures
WHERE
Name = ''' + @storedProcName + ''''
IF @debug = 1 PRINT @sql
EXEC sp_executesql
@sql = @sql,
@params = @params,
@exists = @exists OUTPUT
SET @err = @@ERROR
IF ISNULL(@err, 0) != 0 GOTO ERROR_HANDLER
IF @exists = 1 INSERT INTO #output VALUES (@databaseName)
FETCH NEXT FROM dbCursor INTO @databaseName
END
ERROR_HANDLER:
CLOSE dbCursor
DEALLOCATE dbCursor
IF ISNULL(@err, 0) != 0
RAISERROR('--- Ending [FindStoredProcOnServer]: Failed', 16, 1)
ELSE
SELECT * FROM #output
RETURN ISNULL(@err, 0)
END