Sql server SQL Server 2008视图正在丢失默认值

Sql server SQL Server 2008视图正在丢失默认值,sql-server,sql-server-2008,view,Sql Server,Sql Server 2008,View,我有一个奇怪的问题,在创建视图一段时间后,applicationID的默认值丢失或重置(我们不知道为什么,我们有0.000或0或null之类的值) 如果我们运行ALTER语句,applicationID的值返回到最初定义的值 ALTER VIEW [schemaA].[tableA] AS SELECT *, 123456 applicationID FROM [schemaB].[dbo].[tableA] 我需要提到的是,在运行ALTE

我有一个奇怪的问题,在创建视图一段时间后,applicationID的默认值丢失或重置(我们不知道为什么,我们有0.000或0或null之类的值)

如果我们运行
ALTER
语句,
applicationID
的值返回到最初定义的值

ALTER VIEW [schemaA].[tableA]
AS
    SELECT 
        *, 123456 applicationID
    FROM 
        [schemaB].[dbo].[tableA] 
我需要提到的是,在运行
ALTER
语句之前,我们导出了视图DDL,它是正确的

如何确定是什么损坏了视图定义,或者视图是否应该有不同的定义(如果可能的话,可以设置默认值)


谢谢

可能是这样的吗

CREATE TABLE testTbl(aColumn INT);
INSERT INTO testTbl VALUES(1),(2);
GO

CREATE VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   1234
    2   1234
*/
GO

--be aware of the fact, that the new column is called newColumn and its type is varchar(5)!
ALTER TABLE testTbl ADD newColumn varchar(5);
GO
UPDATE testTbl SET newColumn='test';
GO

--The varchar value "test" comes under the column caption "applicationID"!
SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   test
    2   test
*/
GO

--now you re-compile it with your attempt to ALTER the VIEW
ALTER VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn newColumn applicationID
    1   test      1234
    2   test      1234
*/
GO

--clean up
DROP VIEW vwTestTbl;
DROP TABLE testTbl;

在任何情况下,这个
applicationID
都是文字(固定)值吗?您的
CREATE VIEW
statemet是否与上述内容完全相同?如果没有,请发布完整的语句。@Shnugo该值在创建时是固定的,上面的语句完全相同。“创建时固定”的确切含义是什么?这个语句是由某种动态过程重新创建的吗?或者它只创建了一次,从未更改过?可能是有人更改了表结构(添加了一些字段),忘记了重新编译视图-在这种情况下,如果视图定义包含
select*
,而不是显式字段列表,SQL server会将视图结果搞砸。@Arvo,根据您的评论,我在回答中对示例做了更具体的说明。事实上,这甚至会弄乱类型。。。有充分的理由反对
SELECT*
理论上可能,我不知道谁可能正在运行“ALTER TABLE testTbl ADD applicationID INT NULL;”,如果是这样,我怎么知道呢?@christi_b,不知道您的进程,我无法告诉您。。。每个对象都有一个
modify\u date
(尝试从sys.objects中选择一个
SELECT*,其中name='someName'
您至少会发现,当对象上次被更改时……这似乎是最合理的情况
CREATE TABLE testTbl(aColumn INT);
INSERT INTO testTbl VALUES(1),(2);
GO

CREATE VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   1234
    2   1234
*/
GO

--be aware of the fact, that the new column is called newColumn and its type is varchar(5)!
ALTER TABLE testTbl ADD newColumn varchar(5);
GO
UPDATE testTbl SET newColumn='test';
GO

--The varchar value "test" comes under the column caption "applicationID"!
SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   test
    2   test
*/
GO

--now you re-compile it with your attempt to ALTER the VIEW
ALTER VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn newColumn applicationID
    1   test      1234
    2   test      1234
*/
GO

--clean up
DROP VIEW vwTestTbl;
DROP TABLE testTbl;