首页 > 解决方案 > 如何使用 SQL 提取作为任何给定更改的一部分部署的任何存储过程的详细信息?

问题描述

我正在寻找编写一些代码,可用于收集作为同一更改的一部分部署的项目。

在他们那一刻,我正在使用下面的代码,

DECLARE @Package INT = (SELECT MAX(package_id) FROM SSISDB.catalog.packages WHERE [name] = 'MyPackage.dtsx')
SELECT  pr.project_id
,       pr.[name]
,       pr.last_deployed_time
,       pr.deployed_by_name
,       pa.[name]
,       pa.version_build
FROM SSISDB.catalog.projects pr
INNER JOIN SSISDB.catalog.packages pa ON pr.project_id = pa.project_id
WHERE   pa.package_id = @Package

这目前针对的是发布给定 SSIS 包的时间,但有时我可能必须检查仅是存储过程更改的解决方案,因此没有 SSIS 包)。

有没有办法通过 SQL 以类似的方式获取存储过程更改?

标签: sql-serverstored-proceduresssisssms

解决方案


在与其中一位开发人员讨论后,我得出了以下代码,虽然使用了动态 SQL,但测试人员除了 tempdb 之外没有任何权限,因此他们可以安全使用。

DECLARE @DaysBack VARCHAR(2) = '-1'

IF OBJECT_ID('tempdb..#T') IS NOT NULL
    DROP TABLE #T;
IF OBJECT_ID('tempdb..#D') IS NOT NULL
    DROP TABLE #D;
CREATE TABLE #D (
    [DBName] [NVARCHAR](128) NULL,
    [SchemaName] [NVARCHAR](128) NULL,
    [name] [NVARCHAR](128) NOT NULL,
    [type_desc] [VARCHAR](30) NOT NULL,
    [create_date] [datetime] NULL,
    [modify_date] [datetime] NULL,
    )


SELECT  ROW_NUMBER() OVER (ORDER BY name ASC) AS cnt
,       name
INTO    #T
FROM    sys.databases 
DECLARE @sqlVar INT = (SELECT MAX(cnt) FROM #T);
DECLARE @DBName NVARCHAR(128);
DECLARE @SQL NVARCHAR(4000);


WHILE @sqlVar > 0
BEGIN
    SET @DBName = (SELECT name FROM #T WHERE cnt = @sqlVar)
    SET @SQL = 
    'BEGIN TRY
    INSERT INTO #D
    SELECT  ''' + @DBName + ''' AS DBName 
    ,       schema_name(schema_id) AS SchemaName
    ,       [name]
    ,       [type_desc]
    ,       [create_date]
    ,       [modify_date]
    FROM    ' + @DBName + '.sys.objects
    WHERE   [modify_date] > DATEADD(dd,' + @DaysBack + ',GETDATE()) AND
        [type] NOT IN (''S'',''U'',''PK'',''D'',''V'',''FN'',''UQ'',''SQ'',''IT'',''F'',''TF'',''IF'',''TT'')
    END TRY
    BEGIN CATCH
    END CATCH
    '
    --SELECT @SQL
    EXEC sp_executesql @SQL
    SET @sqlVar = @sqlVar-1 
END

SELECT * FROM #D ORDER BY modify_date DESC

推荐阅读