更改列长会以任何方式影响视图?

时间:2014-05-21 11:03:23

标签: sql database sql-server-2008 view

如果我更改了我在视图中使用的表的列长度,这会以任何方式影响视图吗?

注意:我使用的是Sql Server 2008

1 个答案:

答案 0 :(得分:1)

如果您使用schemabinding创建了视图(索引所需),那么您无法在不先删除视图的情况下进行更改,如果您还没有将更改简单地级联到视图,是的,它会影响视图。虽然您可能需要运行sp_refreshview来刷新元数据。 online documentation states

  

如果未使用SCHEMABINDING子句创建视图,则应在对视图下方影响视图定义的对象进行更改时运行sp_refreshview。否则,查询时视图可能会产生意外结果。

我目前正在努力寻找改变长度而不是运行`sp_refreshview'产生意外的结果。有了这个简单的例子:

CREATE TABLE dbo.T (Col VARCHAR(10));
INSERT dbo.T (Col) VALUES (REPLICATE('X', 10));
GO
CREATE VIEW dbo.V
AS
SELECT *
FROM dbo.T;
GO
SELECT *
FROM dbo.V;

ALTER TABLE dbo.T ALTER COLUMN Col VARCHAR(30);
INSERT dbo.T (Col) VALUES (REPLICATE('X', 30));

SELECT *
FROM dbo.V;

即使sp_refreshview尚未运行as demonstrated here,在更改完成后仍可使用 - dbo.V中的第二个选项仍会提供完整的30个字符第二排。 然而我仍然建议执行它,它不会伤害!!如果您在更改后检查元数据:

SELECT max_length
FROM sys.columns
WHERE name = 'Col'
AND [object_id] = OBJECT_ID(N'dbo.V', 'V');

更改后长度仍为10。作为示例,在不调用sp_refreshview时显示exxt的类型,运行时:

CREATE TABLE dbo.T (Col VARCHAR(10));
INSERT dbo.T (Col) VALUES (REPLICATE('X', 10));
GO
CREATE VIEW dbo.V
AS
SELECT *
FROM dbo.T;
GO
SELECT *
FROM dbo.V;

ALTER TABLE dbo.T ADD Col2 VARCHAR(30);
INSERT dbo.T (Col2) VALUES (REPLICATE('X', 30));

SELECT *
FROM dbo.V;

在第二个选择you will not see the column Col2。然而,在这种情况下,我会责怪视图的作者使用SELECT * !!!