有没有办法识别哪个SP返回数据

Jas*_*son 1 sql-server

我继承了一个数据库(SQL Server 2016),它有将近 6000 个 SP 并且没有命名约定……我必须识别所有返回数据的 SP,哪些是更新、插入或删除……很多 SP 很复杂,并且可以进行更新 /插入然后返回数据.... 有什么方法可以识别哪些sp返回数据哪些不返回(IE是纯插入/删除/更新)......。除了视觉上的眼球,每个都有一个快速的方法......

先感谢您。

Eri*_*ing 5

这对我来说在本地工作以识别使用 返回的结果sp_describe_first_result_set,这仅在 SQL Server 2012+ 上可用。这是事情的快速/肮脏的一面,但希望它能让你开始,

Use [Yourmom]

CREATE TABLE #commands
     (
         ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
         CurrentObject sysname,
         Command NVARCHAR(2000)
     );

CREATE TABLE #success
     (
         object_name sysname NULL,
         is_hidden BIT NULL,
         column_ordinal INT NULL,
         name sysname NULL,
         is_nullable BIT NULL,
         system_type_id INT NULL,
         system_type_name sysname NULL,
         max_length SMALLINT NULL,
         precision TINYINT NULL,
         scale TINYINT NULL,
         collation_name sysname NULL,
         user_type_id INT NULL,
         user_type_database sysname NULL,
         user_type_schema sysname NULL,
         user_type_name sysname NULL,
         assembly_qualified_type_name NVARCHAR(4000) NULL,
         xml_collection_id INT NULL,
         xml_collection_database sysname NULL,
         xml_collection_schema sysname NULL,
         xml_collection_name sysname NULL,
         is_xml_document BIT NULL, 
         is_case_sensitive BIT NULL, 
         is_fixed_length_clr_type BIT NULL, 
         source_server sysname NULL, 
         source_database sysname NULL, 
         source_schema sysname NULL,
         source_table sysname NULL,
         source_column sysname NULL,
         is_identity_column BIT NULL,
         is_part_of_unique_key BIT NULL, 
         is_updateable BIT NULL, 
         is_computed_column BIT NULL, 
         is_sparse_column_set BIT NULL, 
         ordinal_in_order_by_list SMALLINT NULL,
         order_by_is_descending SMALLINT NULL,
         order_by_list_length SMALLINT NULL, 
         tds_type_id INT NULL,
         tds_length INT NULL,
         tds_collation_id INT NULL,
         tds_collation_sort_id INT NULL
     );

CREATE TABLE #fail (
                    ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
                    CurrentObject sysname,
                    Command NVARCHAR(2000),
                    Error_Line INT,
                    Error_Message NVARCHAR(4000),
                    Error_Number INT,
                    Error_Procedure sysname,
                    Error_Severity INT,
                    Error_State INT 
                    );

DECLARE @CurrentObject sysname;
DECLARE @CurrentCommand NVARCHAR(2000);

INSERT INTO #commands ( CurrentObject, Command )
SELECT OBJECT_NAME(sm.object_id),
       N'EXEC sys.sp_describe_first_result_set @tsql = N''EXEC ' + OBJECT_NAME(sm.object_id) + N''';'
FROM   sys.sql_modules AS sm
WHERE  OBJECT_NAME(sm.object_id) IS NOT NULL
AND    sm.definition LIKE '%CREATE%PROC%';

DECLARE result_cursor CURSOR FOR
SELECT CurrentObject, Command FROM #commands

OPEN result_cursor
FETCH NEXT FROM result_cursor into @CurrentObject, @CurrentCommand
WHILE @@FETCH_STATUS = 0
BEGIN 

 BEGIN TRY

    PRINT @CurrentCommand;
    INSERT #success (
                             is_hidden,
                             column_ordinal,
                             name,
                             is_nullable,
                             system_type_id,
                             system_type_name,
                             max_length,
                             precision,
                             scale,
                             collation_name,
                             user_type_id,
                             user_type_database,
                             user_type_schema,
                             user_type_name,
                             assembly_qualified_type_name,
                             xml_collection_id,
                             xml_collection_database,
                             xml_collection_schema,
                             xml_collection_name,
                             is_xml_document,
                             is_case_sensitive,
                             is_fixed_length_clr_type,
                             source_server,
                             source_database,
                             source_schema,
                             source_table,
                             source_column,
                             is_identity_column,
                             is_part_of_unique_key,
                             is_updateable,
                             is_computed_column,
                             is_sparse_column_set,
                             ordinal_in_order_by_list,
                             order_by_is_descending,
                             order_by_list_length,
                             tds_type_id,
                             tds_length,
                             tds_collation_id,
                             tds_collation_sort_id
                         )
    EXEC(@CurrentCommand);

END TRY

BEGIN CATCH

        INSERT #fail (
                      CurrentObject,
                      Command,
                      Error_Line,
                      Error_Message,
                      Error_Number,
                      Error_Procedure,
                      Error_Severity,
                      Error_State
                     )

        SELECT @CurrentObject,
               @CurrentCommand,
               ERROR_LINE(),
               ERROR_MESSAGE(),
               ERROR_NUMBER(),
               ERROR_PROCEDURE(),
               ERROR_SEVERITY(), 
               ERROR_STATE();


END CATCH;

    UPDATE #success
    SET object_name = @CurrentObject
    WHERE object_name IS NULL

FETCH NEXT FROM result_cursor into @CurrentObject, @CurrentCommand
END

CLOSE result_cursor
DEALLOCATE result_cursor

SELECT *
FROM #commands AS c

SELECT *
FROM #success AS s

SELECT * 
FROM #fail AS f

DROP TABLE #commands, #fail, #success
Run Code Online (Sandbox Code Playgroud)