你调用的对象是空的。 (SqlMgmt) 使用 SSMS 向导更新扩展属性时
Posted
技术标签:
【中文标题】你调用的对象是空的。 (SqlMgmt) 使用 SSMS 向导更新扩展属性时【英文标题】:Object reference not set to an instance of an object. (SqlMgmt) while updating extended properties with SSMS wizard 【发布时间】:2021-07-27 07:52:11 【问题描述】:更新时(单击确定按钮,或 SSMS 向导页面上的脚本), SSMS 出现错误:对象引用未设置为对象的实例。 (SqlMgmt)
虽然使用系统过程(EXEC sys.sp_updateextendedproperty)执行该操作没有问题,并且可以成功执行,但是SSMS似乎无法在向导页面(存储过程属性)上生成此操作。
我在本地系统上重新安装了 SSMS,但没有成功!
连接到此实例的客户端和开发人员的每个本地系统都存在相同的错误!我相信这是服务器实例范围内的问题,而不是客户端的 SSMS。
从其他对象(如表、视图、函数等)更新扩展属性没有问题,但只是存储过程!
我认为msdb数据库的某些系统表中可能有一些脏记录!!!
【问题讨论】:
你应该在Serverfault上问它。 亲爱的@Rezu,这不是服务器故障!实际上这是 SQL-Server 错误,它允许在扩展属性中插入 NULL 值,然后在它们上出现错误!!! (有关更多信息,请查看我对这个问题的回答。) 【参考方案1】:我自己解决! 问题是我的所有存储过程都有一个带有 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 值然后在它们上面得到 ERROR Object reference not set to an instance of an object.
!!!
【讨论】:
以上是关于你调用的对象是空的。 (SqlMgmt) 使用 SSMS 向导更新扩展属性时的主要内容,如果未能解决你的问题,请参考以下文章
这个 VB.NET 错误是啥意思? '你调用的对象是空的。' [复制]
struts2中的if标签怎样判断action中的对象是不是为空