删除 SQL Server 上的所有扩展属性

问题描述 投票:0回答:7

如何以可编写脚本的方式删除 SQL Server 上的所有扩展属性?

sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2
7个回答
22
投票

如果您想要一个脚本一次性删除所有扩展属性,请使用 Jamie Thomson 创建的脚本,该脚本将为所有扩展属性生成删除。您可以从这篇文章下载它。

我已将他的脚本粘贴在这里(完整的致谢,以防文章被删除):

/*
This script will generate calls to sp_dropextendedproperty for every
extended property that exists in your database.
Actually, a caveat: I don't promise that it will catch each and every 
extended property that exists, but I'm confident it will catch most of them!

It is based on this: 
http://blog.hongens.nl/2010/02/25/drop-all-extended-properties-in-a-mssql-database/ 
by Angelo Hongens.

Also had lots of help from this:
http://www.sqlservercentral.com/articles/Metadata/72609/
by Adam Aspin

Adam actually provides a script at that link to do something very similar
but when I ran it I got an error:
Msg 468, Level 16, State 9, Line 78
Cannot resolve the collation conflict between "Latin1_General_100_CS_AS" and "Latin1_General_CI_AS" in the equal to operation.

So I put together this version instead. 

Use at your own risk.

Jamie Thomson
2012-03-25
*/


/*Are there any extended properties? Let's take a look*/
select  *,OBJECT_NAME(major_id) from    sys.extended_properties xp

/*Now let's generate sp_dropextendedproperty statements for all of them.*/
--tables
set nocount on;
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.tables t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--columns
select 'EXEC sp_dropextendedproperty
@name = '''+sys.extended_properties.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(extended_properties.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(extended_properties.major_id) + '''
,@level2type = ''column''
,@level2name = ''' + columns.name + ''''
from sys.extended_properties
join sys.columns
on columns.object_id = extended_properties.major_id
and columns.column_id = extended_properties.minor_id
where extended_properties.class_desc = 'OBJECT_OR_COLUMN'
and extended_properties.minor_id > 0
union
--check constraints
select  'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from    sys.extended_properties xp
join sys.check_constraints cc       on  xp.major_id = cc.object_id
union
--check constraints
select  'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from    sys.extended_properties xp
join sys.default_constraints cc     on  xp.major_id = cc.object_id
union
--views
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''view''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.views t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--sprocs
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''procedure''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.procedures t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--FKs
select  'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from    sys.extended_properties xp
join sys.foreign_keys cc        on  xp.major_id = cc.object_id
union
--PKs
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''CONSTRAINT'', @level2name = [' + SKC.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
 INNER JOIN sys.schemas SCH
 ON TBL.schema_id = SCH.schema_id 
 INNER JOIN sys.extended_properties SEP
 INNER JOIN sys.key_constraints SKC
 ON SEP.major_id = SKC.object_id 
 ON TBL.object_id = SKC.parent_object_id 
WHERE SKC.type_desc = N'PRIMARY_KEY_CONSTRAINT'
union
--Table triggers
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''TRIGGER'', @level2name = [' + TRG.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
 INNER JOIN sys.triggers TRG
 ON TBL.object_id = TRG.parent_id 
 INNER JOIN sys.extended_properties SEP
 ON TRG.object_id = SEP.major_id 
 INNER JOIN sys.schemas SCH
 ON TBL.schema_id = SCH.schema_id
union
--UDF params
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''FUNCTION'', @level1name = [' + OBJ.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
 INNER JOIN sys.objects OBJ
 ON SEP.major_id = OBJ.object_id 
 INNER JOIN sys.schemas SCH
 ON OBJ.schema_id = SCH.schema_id 
 INNER JOIN sys.parameters PRM
 ON SEP.major_id = PRM.object_id 
 AND SEP.minor_id = PRM.parameter_id 
WHERE SEP.class_desc = N'PARAMETER'
 AND OBJ.type IN ('FN', 'IF', 'TF') 
union
--sp params
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''PROCEDURE'', @level1name = [' + SPR.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
 INNER JOIN sys.procedures SPR
 ON SEP.major_id = SPR.object_id 
 INNER JOIN sys.schemas SCH
 ON SPR.schema_id = SCH.schema_id 
 INNER JOIN sys.parameters PRM
 ON SEP.major_id = PRM.object_id 
 AND SEP.minor_id = PRM.parameter_id 
WHERE SEP.class_desc = N'PARAMETER'
union
--DB
SELECT 
'EXEC sys.sp_dropextendedproperty @name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
WHERE class_desc = N'DATABASE'
union
--schema
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
 INNER JOIN sys.schemas SCH
 ON SEP.major_id = SCH.schema_id 
WHERE SEP.class_desc = N'SCHEMA'
union
--DATABASE_FILE
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '], @level1type = ''LOGICAL FILE NAME'', @level1name = ' + DBF.name + ' ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
 INNER JOIN sys.database_files DBF
 ON SEP.major_id = DBF.file_id 
 INNER JOIN sys.data_spaces DSP
 ON DBF.data_space_id = DSP.data_space_id 
WHERE SEP.class_desc = N'DATABASE_FILE'
union
--filegroup
SELECT 
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
 INNER JOIN sys.data_spaces DSP
 ON SEP.major_id = DSP.data_space_id
WHERE DSP.type_desc = 'ROWS_FILEGROUP'
union
-- INDEX
select 'EXEC sp_dropextendedproperty
@name = '''+sys.extended_properties.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(extended_properties.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(extended_properties.major_id) + '''
,@level2type = ''index''
,@level2name = ''' + indexes.name + ''''
from sys.extended_properties
join sys.indexes
on indexes.object_id = extended_properties.major_id
and indexes.index_id = extended_properties.minor_id
where extended_properties.class_desc = 'INDEX'
and extended_properties.minor_id > 0

4
投票

使用这个脚本

EXEC sys.sp_dropextendedproperty 
     @name  =N'MS_Description', 
     @level0type = N'SCHEMA', 
     @level0name = N'dbo',
     @level1type = N'TABLE',
     @level1name = N'ActivityEventRecipient';
GO 

来源:删除扩展属性


2
投票

我尝试运行脚本,但似乎没有任何效果。然而,我确实发现我可以通过转到

Object Explorer
中的表/视图并执行以下操作来删除扩展属性:

  • 右键单击对象资源管理器中的表/视图,选择属性
  • 从左侧窗格中选择扩展属性
  • 选择扩展属性,然后单击窗口右下角的删除

1
投票

请参阅以下 URL 来删除扩展属性:

http://msdn.microsoft.com/en-us/library/ms178595.aspx


0
投票

无法添加评论,我只能将其添加为答案。

对于视图列,脚本是错误的。列部分应更改为:

--columns
select 'EXEC sp_dropextendedproperty
@name = '''+sys.extended_properties.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(extended_properties.major_id) + '''
,@level1type = ''' + Case so.type
                         When 'u'
                             Then
                             'table'
                         When 'v'
                             Then
                             'view'
                     End + '''
,@level1name = ''' + object_name(extended_properties.major_id) + '''
,@level2type = ''column''
,@level2name = ''' + columns.name + ''''
from sys.extended_properties
join sys.columns
on columns.object_id = extended_properties.major_id
and columns.column_id = extended_properties.minor_id
    Join
        sys.objects As so
            On
            columns.object_id     = so.object_id
Where
    extended_properties.class_desc   = 'OBJECT_OR_COLUMN'
    And extended_properties.minor_id > 0
    And so.type In
        ( 'u', 'v' )

0
投票
You need to add this block for functions
UNION
-- functions
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''function''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.objects t ON xp.major_id = t.object_id AND t.type IN ('FN', 'IF', 'TF')  
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0;
UNION
-- for synonyms
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''synonym''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.synonyms t ON xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0

0
投票

此脚本与其他 anwsers 类似,允许您检查和过滤扩展属性: 只需在最后添加一个where子句即可

/*
It is based on this: 
http://sqlblog.com/blogs/jamie_thomson/archive/2012/03/25/generate-drop-statements-for-all-extended-properties.aspx

http://www.sqlservercentral.com/articles/Metadata/72609/
by Adam Aspin

/*Are there any extended properties? Let's take a look*/
--select  *,OBJECT_NAME(major_id) from    sys.extended_properties xp

SET NOCOUNT ON;

SELECT props.*, DropStatement = 'EXEC sp_dropextendedproperty @name = ''' + name + ''',@level0type = ''' + level0type + ''',@level0name =''' + level0name + ''',@level1type = ''' + level1type + ''',@level1name = ''' + level1name + '''' + CASE 
        WHEN level2type IS NULL
            THEN ''
        ELSE ',@level2type = ''' + level2type + ''',@level2name = ''' + level2name + ''''
        END
FROM (
    --tables
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(xp.major_id), level2Type = cast(NULL AS VARCHAR(255)), level2Name = cast(NULL AS VARCHAR(255)), xp.value
    FROM sys.extended_properties xp
    JOIN sys.tables t ON xp.major_id = t.object_id
    WHERE xp.class_desc = 'OBJECT_OR_COLUMN'
        AND xp.minor_id = 0
    
    UNION
    
    --columns
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(xp.major_id), level2Type = NULL, level2Name = NULL, xp.value
    FROM sys.extended_properties xp
    JOIN sys.columns ON columns.object_id = xp.major_id
        AND columns.column_id = xp.minor_id
    WHERE xp.class_desc = 'OBJECT_OR_COLUMN'
        AND xp.minor_id > 0
    
    UNION
    
    --check constraints
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(cc.parent_object_id), level2type = 'constraint', level2name = cc.name, xp.value
    FROM sys.extended_properties xp
    JOIN sys.check_constraints cc ON xp.major_id = cc.object_id
    
    UNION
    
    --check default constraints
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(cc.parent_object_id), level2type = 'constraint', level2name = cc.name, xp.value
    FROM sys.extended_properties xp
    JOIN sys.default_constraints cc ON xp.major_id = cc.object_id
    
    UNION
    
    --views
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'view', level1name = object_name(xp.major_id), level2Type = NULL, level2Name = NULL, xp.value
    FROM sys.extended_properties xp
    JOIN sys.VIEWS t ON xp.major_id = t.object_id
    WHERE xp.class_desc = 'OBJECT_OR_COLUMN'
        AND xp.minor_id = 0
    
    UNION
    
    --sprocs
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'view', level1name = object_name(xp.major_id), level2Type = NULL, level2Name = NULL, xp.value
    FROM sys.extended_properties xp
    JOIN sys.procedures t ON xp.major_id = t.object_id
    WHERE xp.class_desc = 'OBJECT_OR_COLUMN'
        AND xp.minor_id = 0
    
    UNION
    
    --FKs
    SELECT xp.Name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(cc.parent_object_id), level2type = 'constraint', level2name = cc.name, xp.value
    FROM sys.extended_properties xp
    JOIN sys.foreign_keys cc ON xp.major_id = cc.object_id
    
    UNION
    
    --PKs
    SELECT Name = REPLACE(CAST(xp.name AS NVARCHAR(300)), '''', ''''''), level0type = 'schema', level0name = SCH.name, level1type = 'table', level1name = '[' + TBL.name + ']', level2type = 'constraint', level2name = SKC.name, xp.value
    FROM sys.tables TBL
    INNER JOIN sys.schemas SCH ON TBL.schema_id = SCH.schema_id
    INNER JOIN sys.extended_properties xp
    INNER JOIN sys.key_constraints SKC ON xp.major_id = SKC.object_id ON TBL.object_id = SKC.parent_object_id WHERE SKC.type_desc = N'PRIMARY_KEY_CONSTRAINT'
    
    UNION
    
    --Table triggers
    SELECT Name = REPLACE(CAST(xp.name AS NVARCHAR(300)), '''', ''''''), level0type = 'schema', level0name = SCH.name, level1type = 'table', level1name = '[' + TBL.name + ']', level2type = 'TRIGGER', level2name = TRG.name, xp.value
    FROM sys.tables TBL
    INNER JOIN sys.triggers TRG ON TBL.object_id = TRG.parent_id
    INNER JOIN sys.extended_properties xp ON TRG.object_id = xp.major_id
    INNER JOIN sys.schemas SCH ON TBL.schema_id = SCH.schema_id
    
    UNION
    
    --UDF params
    SELECT Name = REPLACE(CAST(xp.name AS NVARCHAR(300)), '''', ''''''), level0type = 'schema', level0name = SCH.name, level1type = 'FUNCTION', level1name = '[' + OBJ.name + ']', level2type = 'PARAMETER', level2name = PRM.name, xp.value
    FROM sys.extended_properties xp
    INNER JOIN sys.objects OBJ ON xp.major_id = OBJ.object_id
    INNER JOIN sys.schemas SCH ON OBJ.schema_id = SCH.schema_id
    INNER JOIN sys.parameters PRM ON xp.major_id = PRM.object_id
        AND xp.minor_id = PRM.parameter_id
    WHERE xp.class_desc = N'PARAMETER'
        AND OBJ.type IN ('FN','IF','TF')
    
    UNION
    
    --sp params
    SELECT Name = REPLACE(CAST(xp.name AS NVARCHAR(300)), '''', ''''''), level0type = 'schema', level0name = SCH.name, level1type = 'PROCEDURE', level1name = '[' + SPR.name + ']', level2type = 'PARAMETER', level2name = PRM.name, xp.value
    FROM sys.extended_properties xp
    INNER JOIN sys.procedures SPR ON xp.major_id = SPR.object_id
    INNER JOIN sys.schemas SCH ON SPR.schema_id = SCH.schema_id
    INNER JOIN sys.parameters PRM ON xp.major_id = PRM.object_id
        AND xp.minor_id = PRM.parameter_id
    WHERE xp.class_desc = N'PARAMETER'
    
    UNION
    
    -- INDEX
    SELECT Name = xp.name, level0type = 'schema', level0name = object_schema_name(xp.major_id), level1type = 'table', level1name = object_name(xp.major_id), level2type = 'index', level2name = indexes.name, xp.value
    FROM sys.extended_properties xp
    JOIN sys.indexes ON indexes.object_id = xp.major_id
        AND indexes.index_id = xp.minor_id
    WHERE xp.class_desc = 'INDEX'
        AND xp.minor_id > 0
    ) AS props
© www.soinside.com 2019 - 2024. All rights reserved.