奇怪的(缓存?)问题(错误?)与T-SQL视图

时间:2012-10-25 14:38:01

标签: sql sql-server tsql sql-server-2005

通过将视图编写为create,删除视图,然后使用脚本重新创建视图来解决此问题,因此很明显,视图本身没有任何错误。但是,我很好奇原因是什么......

我创建了这样的:

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_V有许多不同的字段,但相关字段为StatusISStatus,在视图创建中定义为:

,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]

今天,我将ISStatus列添加到AD.dbo.ADEmployees_V(之前有Status)。

在做出改变之后,我做了一个:

SELECT * FROM [Employees_V]

令人惊讶的是,这并没有返回正确的结果。 ISStatus未显示为列标题,而是使用新的IsTerritoryManager值填充ISStatus,而不是使用0填充{/ 1}}。

我猜这是某种缓存问题,但我会解释发生了什么事情。谢谢!

1 个答案:

答案 0 :(得分:1)

视图的列列表是在CREATE或ALTER时生成的。 如果您在视图定义中使用SELECT * FROm table,则视图的列列表将填充table的当前字段列表。

向表中添加新列不会更改视图定义,这就是为什么需要重新创建它以“刷新”它的列。