0

更新时(单击“确定”按钮或 SSMS 向导页面上的脚本),SSMS 出现错误:对象引用未设置为对象的实例。(SqlMgmt) 点击错误!

错误预告信息

虽然使用系统过程(EXEC sys.sp_updateextendedproperty)执行该操作没有问题并且这将成功执行,但似乎SSMS无法在向导页面(存储过程属性)上生成此操作。

  • 我在本地系统上重新安装了 SSMS,但没有成功!

  • 连接到此实例的客户端和开发人员的每个本地系统上都存在相同的错误!我相信这是服务器实例范围的问题,而不是客户端的 SSMS。

  • 从其他对象(如表、视图、函数等)更新扩展属性没有问题,而只是存储过程!

  • 我想也许msdb数据库的一些系统表中有一些脏记录!!!

4

1 回答 1

0

我自己解决!问题是我的所有存储过程都有一个带有 NULL 值的扩展属性!!!

所以要解决这个问题应该更新它们并为它们生成 Not NULL 值。

下面的示例代码将使用其扩展属性中的 NULL 值更新存在的整个存储过程的所有值(只需将 替换为YOUR_EXTENDED_PROPERTY_NAME您自己的具有 NULL 值并且应该更新的扩展属性名称):

DECLARE @Query AS NVARCHAR (MAX);
DECLARE c CURSOR FOR
----------------------------------------------------
SELECT 'begin try EXEC sys.sp_updateextendedproperty @name=''YOUR_EXTENDED_PROPERTY_NAME'', @value='''' , @level0type=''SCHEMA'',@level0name='''
       + schemaName + ''', @level1type=N''PROCEDURE'',@level1name=N''' + spname + ''' End try Begin catch End catch'
FROM (
         SELECT Ob.name  spname,
                EX.name  extended_name,
                sch.name AS schemaName,
                EX.value
         FROM sys.extended_properties AS EX
         JOIN sys.objects             AS Ob ON Ob.object_id = EX.major_id
         JOIN sys.schemas             AS sch ON sch.schema_id = Ob.schema_id
         WHERE Ob.type = 'P'
               AND EX.value IS NULL
     ) t;

----------------------------------------------------
OPEN c;
FETCH NEXT FROM c
INTO @Query;
WHILE @@fetch_status <> -1
BEGIN
    EXECUTE sp_executesql @Query;
    FETCH NEXT FROM c
    INTO @Query;
END;
CLOSE c;
DEALLOCATE c;

问题是,为什么微软让插入 NULL 值然后Object reference not set to an instance of an object.在它们上面得到错误!!!

于 2021-07-27T10:57:00.207 回答