【发布时间】:2017-04-06 12:36:44
【问题描述】:
在我的测试 SQL Server 2014 安装中,我正在“清理”主数据库。
使用以下命令,我正在检查存在哪些用户对象:
SELECT
'DROP ' +
CASE
WHEN [sys].[all_objects].type IN ('AF','FN','FS','FT','IF','TF') THEN 'FUNCTION '
WHEN [sys].[all_objects].type IN ('D','C','F','PK','UQ') THEN 'CONSTRAINT '
WHEN [sys].[all_objects].type IN ('IT','S','U') THEN 'TABLE '
WHEN [sys].[all_objects].type IN ('P','PC','RF','X') THEN 'PROCEDURE '
WHEN [sys].[all_objects].type IN ('TA','TR') THEN 'TRIGGER '
WHEN [sys].[all_objects].type = 'R' THEN 'RULE '
WHEN [sys].[all_objects].type = 'SN' THEN 'SYNONYM '
WHEN [sys].[all_objects].type = 'TT' THEN 'TYPE '
WHEN [sys].[all_objects].type = 'V' THEN 'VIEW '
END +
SCHEMA_NAME(sys.[all_objects].[schema_id]) + '.' + OBJECT_NAME(object_id) + '; ' as [Command],
OBJECT_NAME(object_id) as [ObjectName],
[sys].[all_objects].[type_desc] as [TypeDesc],
[sys].[all_objects].[type] as [Type],
SCHEMA_NAME(sys.[all_objects].[schema_id]) as [Schema]
FROM
sys.[all_objects] WITH (NOLOCK)
WHERE SCHEMA_NAME(sys.[all_objects].[schema_id]) like '%dbo%'
其中一个结果是视图 spt_values。
Command | ObjectName | TypeDesc | Type | Schema
------------------------|------------|----_-----|------|-------
DROP VIEW dbo.spt_values; spt_values VIEW V dbo
因为它不是我所知道的视图之一,所以我删除了它(连同其他对象)。
那天晚些时候,我想在 SSMS 2016 中检查一个数据库的属性,结果出现以下错误:
经过一番搜索,我发现我可以使用脚本 u_tables.sql(位于服务器上的 SQL Server 安装文件夹中)重新创建丢失的视图。来自这里的信息:https://ashishgilhotra.wordpress.com/tag/u_tables-sql/
该脚本中用于创建视图的代码如下:
create view spt_values as
select name collate database_default as name,
number,
type collate database_default as type,
low, high, status
from sys.spt_values
go
EXEC sp_MS_marksystemobject 'spt_values'
go
grant select on spt_values to public
go
在查看代码时,我怀疑它是否会起作用,因为在任何地方都找不到 sys.spt_values 表。
不出所料,我得到了错误
Msg 208, Level 16, State 1, Procedure spt_values, Line 6
Invalid object name 'sys.spt_values'.
在我的另一台装有 SQL Server 2008 的服务器上,有一个表 master.dbo.spt_values(但没有视图)!
经过一番搜索,我发现我可以创建一个同名的表..链接这里https://www.mssqltips.com/sqlservertip/3694/fix-invalid-object-name-masterdbosptvalues-when-viewing-sql-server-database-properties/
现在,我使用另一个 SQL Server 2014 安装中的值创建了一个表,一切似乎又可以正常工作了。
但是,它不 正确!
当我用这个命令检查测试服务器上新创建的对象时
select [name] , [type], [type_desc]
from sys.objects
where name like 'spt_v%'
它显示了一个 user_table 对象。在我的另一台服务器上,它显示了一个视图...
所以,我的问题是:如何创建从表 spt_values 获取数据的视图 spt_values?
【问题讨论】:
标签: sql-server-2014