在SQL Server对象名称中使用点

时间:2017-02-09 13:47:00

标签: sql-server

在您阅读之前 - 这不是关于使用点(这是遗留问题,而其他人错误地选择在对象名称中使用点)。这是关于SQL Server在此特定(不良)情况下的行为的问题。

我们的数据库有两种观点:

viewOneviewOne.bkp

是的,有人在视图名称中愚蠢地添加了一个点。

从第三方工具为这些对象生成的自动脚本为每个视图都有几个sp_refreshview语句。

EXEC sp_refreshview N'[ourSchema].[viewOne]'
EXEC sp_refreshview N'[ourSchema].[viewOne.bkp]'

按上述顺序运行时,viewOne的内容会被viewOne.bkp的内容覆盖。

同样,假设对象名称中的点不是最佳实践,并且MS接受此作为"有效对象名称",如果模式是后者,为什么前者的内容会被后者覆盖?在两个陈述中定义并且存在两个不同的对象?

1 个答案:

答案 0 :(得分:1)

我无法重现您的问题。你能提供重现问题的代码吗?

rextester:http://rextester.com/ZPXB17514

/* does sp_refreshview overwrite view definitions? */
create schema ourSchema authorization dbo;
go
create view ourSchema.viewOne as select * from pilots;
go
create view ourSchema.[viewOne.bkp] as select * from flights;
go
select * from ourSchema.ViewOne
select * from ourSchema.[ViewOne.bkp]
go
alter table dbo.pilots  add new int not null default 1;
alter table dbo.flights add new int not null default 1;
go
/* before refresh, doesn't show new columns */
select * from ourSchema.[ViewOne] 
select * from ourSchema.[ViewOne.bkp]
go
EXEC sp_refreshview N'[ourSchema].[viewOne]'
EXEC sp_refreshview N'[ourSchema].[viewOne.bkp]'
go
/* after refresh, shows new columns -- no view overwritten */
select * from ourSchema.[ViewOne]
select * from ourSchema.[ViewOne.bkp]
go