如果我更改了我在视图中使用的表的列长度,这会以任何方式影响视图吗?
注意:我使用的是Sql Server 2008
答案 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 *
!!!