【发布时间】:2016-06-10 19:37:43
【问题描述】:
抱歉,对于一个令人费解的问题 - 我不是 dba。是否有一个简单的脚本可以运行,它可以列出我在 SQL Server 上的所有存储过程,按数据库分组,并使用存储过程附带的输入和输出参数列出它们。
我在 SQL 之外编写了一个类似的脚本,以对调用存储过程的语言执行相同的操作,因此我会发现遗留应用程序中是否存在冲突。
【问题讨论】:
标签: sql sql-server
抱歉,对于一个令人费解的问题 - 我不是 dba。是否有一个简单的脚本可以运行,它可以列出我在 SQL Server 上的所有存储过程,按数据库分组,并使用存储过程附带的输入和输出参数列出它们。
我在 SQL 之外编写了一个类似的脚本,以对调用存储过程的语言执行相同的操作,因此我会发现遗留应用程序中是否存在冲突。
【问题讨论】:
标签: sql sql-server
使用以下脚本:
DECLARE @CurrentRowID INT
,@CurrentDatabase SYSNAME;
DECLARE @DynamicSQL NVARCHAR(MAX);
IF OBJECT_ID('tempdb..##DataSource') IS NOT NULL
BEGIN
DROP TABLE ##DataSource;
END;
CREATE TABLE ##DataSource
(
[database] SYSNAME
,[procedure] SYSNAME
,[parameter] SYSNAME
,[is_output] BIT
);
DECLARE @DataBases TABLE
(
[RowID] INT IDENTITY(1,1)
,[database] SYSNAME
);
INSERT INTO @DataBases ([database])
SELECT [name]
FROM [sys].[databases];
WHILE EXISTS(SELECT 1 FROM @DataBases)
BEGIN
SELECT TOP 1 @CurrentRowID = [RowID]
,@CurrentDatabase = [database]
FROM @DataBases;
SET @DynamicSQL = N'INSERT INTO ##DataSource
SELECT ''' + @CurrentDatabase + ''' AS [database]
,PR.[name]
,P.[name]
,P.[is_output]
FROM [' + @CurrentDatabase + '].[sys].[procedures] PR
INNER JOIN [' + @CurrentDatabase + '].[sys].[parameters] P
ON PR.[object_id] = P.[object_id]'
EXEC sp_executesql @DynamicSQL;
DELETE FROM @DataBases
WHERE [RowID] = @CurrentRowID;
END;
SELECT *
FROM ##DataSource
当然,您可以过滤一些数据库,或者从sys.procedures dmv 中添加更多列,例如系统类型。
【讨论】:
在 sys.databases 和循环内运行循环/游标,使用并运行以下查询并继续联合:
SELECT pr.name [Procedure], par.name Parameter, CASE WHEN is_output = 1 THEN 'Output Parameter' ELSE 'Input Parameter' END [ParameterType]
FROM sys.parameters par
INNER JOIN sys.procedures pr ON pr.object_id = par.object_id
ORDER BY [Procedure], [ParameterType]
这将为您提供所有过程及其相关参数。
【讨论】:
声明@sql nvarchar(max) = ''
设置@sql = @sql + N'union all select '''+ quotename(d.name) + N''' as db, s.name as sname, p.name as p.name, r.名称为参数名,r.is_output 为参数输出 从 '''+ 引用名(d.name)+ N'''.sys.procedures p 在 p.object_id = r.object_id 上加入 sys.parameters r 在 p.schema_id = s.schema_id' 上加入 sys.schemas 从 sys.databases d -- d.name like .... 按 d.name 排序
设置@sql = stuff@sql, 1, 10, N'') exec sp_executesql @sql
-- 未测试
【讨论】: