SQL Server - Return SCHEMA for sysobjects

后端 未结 8 1472
旧巷少年郎
旧巷少年郎 2020-12-29 21:30

How to I get the SCHEMA when doing a select on sysobjects?

I am modifing a stored procedure called SearchObjectsForText which returns only the Name

8条回答
  •  旧巷少年郎
    2020-12-29 22:24

    Have included an option to delete all objects starting with certain prefix and optionally from certain schema. By the way, I added extra query to get all types which are not stored on sysobjects by default.

    I have uploaded entire sample script to GitHub: DropAll_Dnn_Objects.sql

    Part 1: Temporary Stored Procedure:

    IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL
        DROP PROCEDURE _temp_DropAllDnnObjects;
    GO
    
    CREATE PROCEDURE _temp_DropAllDnnObjects
        @object_prefix NVARCHAR(30),
        @schema_name sysname = NULL
    AS
    BEGIN
        DECLARE @sname sysname, @name sysname, @type NVARCHAR(30)
        DECLARE @object_type NVARCHAR(255), @sql NVARCHAR(2000), @count INT = 0
    
        DECLARE curs CURSOR FOR
            SELECT sname, [name], xtype 
            FROM (
                SELECT SCHEMA_NAME(schema_id) as sname, [name], [type] as xtype
                    FROM sys.objects
                    WHERE [type] IN ('U', 'P', 'FN', 'IF', 'TF', 'V', 'TR')
                        AND name LIKE @object_prefix + '%'
                        AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name))
                UNION ALL
                SELECT SCHEMA_NAME(schema_id) as sname, [name], 'TYPE' as xtype
                    FROM sys.types
                    WHERE is_user_defined = 1
                        AND [name] LIKE @object_prefix + '%'
                        AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name))
                ) a
            ORDER BY CASE xtype
                            WHEN 'P'    THEN 1
                            WHEN 'FN'   THEN 2
                            WHEN 'IF'   THEN 3
                            WHEN 'TF'   THEN 4
                            WHEN 'TR'   THEN 5
                            WHEN 'V'    THEN 6
                            WHEN 'U'    THEN 7
                            WHEN 'TYPE' THEN 8
                            ELSE 9
                        END, name
    
        OPEN curs;
        FETCH NEXT FROM curs INTO @sname, @name, @type;
    
        WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @count = @count + 1
            -- Configuration point 2
            SET @object_type = CASE @type
                            WHEN 'P'    THEN 'PROCEDURE'
                            WHEN 'FN'   THEN 'FUNCTION'
                            WHEN 'IF'   THEN 'FUNCTION'
                            WHEN 'TF'   THEN 'FUNCTION'
                            WHEN 'TR'   THEN 'TRIGGER'
                            WHEN 'V'    THEN 'VIEW'
                            WHEN 'U'    THEN 'TABLE'
                            WHEN 'TYPE' THEN 'TYPE'
                        END
            SET @sql = REPLACE(REPLACE(REPLACE('DROP  [].[];', 
                            '', @object_type),
                            '', @sname),
                            '', @name)
    
            BEGIN TRY  
                PRINT @sql
                EXEC(@sql)
            END TRY  
            BEGIN CATCH  
                PRINT 'ERROR: ' + ERROR_MESSAGE()
            END CATCH  
            FETCH NEXT FROM curs INTO @sname, @name, @type;
        END;
    
        PRINT CONCAT('Objects Found: ', @Count)
        PRINT ''
        PRINT '------------------------------------------------------'
        PRINT ''
    
        CLOSE curs;
        DEALLOCATE curs;
    
        RETURN @Count
    END;
    GO
    

    It will continue on errors (and display the error message). It will return a count of all objects found.

    Part 2: Call Stored Procedure with parameters:

    You can create a WHILE loop in order to run the command until no object is left (dependencies), as follows:

    DECLARE @count INT = 1
    WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'dnn';
    SET @count = 1
    WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'aspnet';
    SET @count = 1
    WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'vw_aspnet';
    GO
    

    Part 3: Finally, get rid of the procedure:

    IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL
        DROP PROCEDURE _temp_DropAllDnnObjects;
    GO
    

提交回复
热议问题