CREATE TABLE #v(v sysname);
DECLARE @sql nvarchar(max) = N'', @obj int = 613577224;
SELECT @sql += N'INSERT #v
SELECT DISTINCT ''sys.' + name + N'''
FROM sys.' + QUOTENAME(name) + N'
WHERE [object_id] = @obj;'
FROM sys.all_views AS v
WHERE EXISTS
(
SELECT 1
FROM sys.all_columns AS c
WHERE c.name = N'object_id'
AND c.[object_id] = v.[object_id]
);
EXEC sys.sp_executesql @sql, N'@obj int', @obj;
SELECT v FROM #v;
DROP TABLE #v;
如果这没有产生任何结果,您可以扩展它以包括所有int目录视图中基于 all 的列,因为有时object_id值存储在具有不同名称的列中,例如referenced_major_id或parent_object_id,并且此处的任何结果也可能会产生线索。
SET NOCOUNT ON;
CREATE TABLE #v(v sysname);
DECLARE @sql nvarchar(max) = N'', @obj int = 613577224;
SELECT @sql += N'INSERT #v
SELECT DISTINCT ''sys.' + v.name + N'''
FROM sys.' + QUOTENAME(v.name) + N'
WHERE ' + QUOTENAME(c.name) + N' = @obj;'
FROM sys.all_views AS v
INNER JOIN sys.all_columns AS c
ON v.[object_id] = c.[object_id]
WHERE v.[schema_id] = 4
AND c.[system_type_id] IN (56,127)
AND v.name NOT IN (N'syscolumns')
AND v.name NOT LIKE N'dm_fts_%';
EXEC sys.sp_executesql @sql, N'@obj int', @obj;
SELECT v FROM #v;
GO
DROP TABLE #v;
好吧,我不知道 ST 代表什么,但根据命名约定,我不得不猜测它是某种系统生成的统计数据。
如果它是一个模块,您可以检查是否有某种文本与对象关联,例如:
您也可以尝试:
最后,您可以尝试暴力破解任何目录视图中的这个对象。此脚本尝试查找包含
object_id
列等于该值的行的任何视图。如果这没有产生任何结果,您可以扩展它以包括所有
int
目录视图中基于 all 的列,因为有时object_id
值存储在具有不同名称的列中,例如referenced_major_id
或parent_object_id
,并且此处的任何结果也可能会产生线索。ST 对象是数据库表使用统计信息。我昨天遇到的情况是我们需要完全删除Azure SQL 托管实例上的架构。在尝试删除模式时,我们无法做到这一点,并得到了一些像 ST__xxxxxx___Chinesechars 这样的长错误......原因是现在删除的表不再属于模式,它们的统计信息仍然存在于托管实例 sys 表。
你有两个选择。在删除表之前尝试删除统计信息:
或者将统计信息移动到另一个模式。不是最好的,但是在删除模式时会让你绕过错误。
似乎是 SQL 托管实例中的错误。