T-SQL视图出现奇怪的(缓存?)问题(Bug?)
解决这个问题的方法是将视图作为创建脚本编写,删除视图,然后使用脚本重新创建视图,因此显然视图本身没有问题。然而,我很好奇原因是什么… 我创建了一个这样的模型:T-SQL视图出现奇怪的(缓存?)问题(Bug?),sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,解决这个问题的方法是将视图作为创建脚本编写,删除视图,然后使用脚本重新创建视图,因此显然视图本身没有问题。然而,我很好奇原因是什么… 我创建了一个这样的模型: CREATE VIEW [dbo].[Employees_V] AS SELECT cast(right(EmployeeNo,4) as int) as EmployeeID ,* ,cast(0 as bit) AS [IsTerritoryManager] ,cast(0 as bit) AS [IsCoordinator] FR
CREATE VIEW [dbo].[Employees_V]
AS
SELECT cast(right(EmployeeNo,4) as int) as EmployeeID
,*
,cast(0 as bit) AS [IsTerritoryManager]
,cast(0 as bit) AS [IsCoordinator]
FROM AD.dbo.ADEmployees_V
AD.dbo.ADEmployees\u V
有许多不同的字段,但相关字段是Status
和ISStatus
,在创建视图时定义为:
,CASE WHEN c.[Status] = 'Active' THEN 'Active' ELSE 'Terminated' END AS [Status]
,CASE WHEN c.[Status] = 'Active' OR ad.[AccountStatus] LIKE '%Enabled%' THEN 'Active' ELSE 'Terminated' END AS [ISStatus]
今天,我在AD.dbo.adeemployees\u V
中添加了ISStatus
列(Status
以前在那里)
在做出改变后,我做了一个:
SELECT * FROM [Employees_V]
令人惊讶的是,这并没有返回正确的结果ISStatus
未显示为列标题,而不是用0填充,iStritoryManager
用新的ISStatus
值填充
我猜这是某种缓存问题,但我希望能解释一下封面下发生了什么。谢谢 视图的列列表在创建或更改时生成。 如果在视图定义中使用
SELECT*FROm table
,视图的列列表将填充table
的当前字段列表
向表中添加新列不会更改视图定义,这就是为什么您需要重新创建它以“刷新”它的列。我认为这就是为什么会有新列的原因,也是为什么通常不赞成在视图或存储过程中使用
select*
。@dotjoe。不恰当的评论。问题中的create视图
,没有select*
@GordonLinoff,遗憾的是,它有(因为它在中间,所以混合在一起)。我很肯定他的答案是正确的。我以前从未见过这种情况。@dotjoe。我的道歉。你是对的。我想知道如果你把*
移动到select的最后会发生什么?你不需要重新创建它sp_refreshview
也可根据@dotjoe对该问题的评论进行操作。