我有一个存储过程ID和名称列表,我需要找出它们所在的服务器中的哪个数据库。是否有捷径可寻?就像存储这些信息的系统表一样?
由于
答案 0 :(得分:1)
通常,对于这种类型的查询,您需要遍历数据库列表(可能使用sp_MSforeachdb
)并查询每个数据库中的各个系统表。
以下内容可能对您有用,但可以避免这种情况。第一种方法检查object_id
和name
但不做任何验证对象实际存储过程。
第二个只使用注释中请求的名称,也验证对象类型,但只检查默认模式。
WITH objects(name, id)
AS (SELECT 'uspGetBillOfMaterials', 23671132 UNION ALL
SELECT 'uspPrintError', 37575172) SELECT 'Using Id and Name',
sys.databases.name,
objects.name
FROM sys.databases,
objects
WHERE OBJECT_NAME(id, database_id) = objects.name
UNION ALL
SELECT 'Using Name (assumes default schema)',
sys.databases.name,
objects.name
FROM sys.databases,
objects
WHERE OBJECT_ID(databases.name + '..uspGetBillOfMaterials', 'P') IS NOT NULL
答案 1 :(得分:0)
给它一个旋转。
DROP TABLE #Databases
CREATE TABLE #Databases (ID INTEGER IDENTITY (0,1), DbName NVARCHAR(128))
INSERT INTO #Databases(DbName)
SELECT name FROM sys.databases
DECLARE @CurrentID INTEGER = 0,
@MaxID INTEGER = (SELECT MAX(ID) FROM #Databases)
DECLARE @DbName NVARCHAR(128) = (SELECT DbName FROM #Databases WHERE ID = @CurrentID),
@SqlCommand VARCHAR(MAX)
WHILE (@CurrentID <= @MaxID)
BEGIN
SET @SqlCommand = 'SELECT name,ROUTINES.SPECIFIC_SCHEMA,ROUTINES.SPECIFIC_NAME
FROM sys.databases AS DatabaseNames
INNER JOIN ' + @DbName + '.INFORMATION_SCHEMA.ROUTINES AS ROUTINES
ON ROUTINES.SPECIFIC_CATALOG = DatabaseNames.name
WHERE ROUTINES.ROUTINE_TYPE = ''PROCEDURE''
AND ROUTINES.SPECIFIC_NAME IN (''X'',''Y'')'
EXEC (@SqlCommand)
SET @CurrentID = @CurrentID + 1
SELECT @DbName = DbName
FROM #Databases
WHERE ID = @CurrentID
END