0

db_owner によって作成されたテーブルがあります

CREATE TABLE [dbo].[TableTest](
[ID] [int] NULL,
[Cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]

同じ定義を持つ別のテーブルですが、別のカスタム スキーマにあります。

CREATE TABLE [Test].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]

次のようなビューを作成すると:

ビューを作成 [Test].[ViewTest] as select * from dbo.TableTest

新しく作成されたビューで選択を行うと、予想どおり dbo.TableTest からではなく、Test.TableTest から結果が取得されます。何が起こっている?

4

1 に答える 1

0

これは、作成後にベース テーブルの構造を変更した場合に発生する可能性がありTest.MyViewます (例: 列を追加/削除する/他の列を削除して再作成する[dbo].[TableTest])。を使用する必要がありますsp_refreshview

CREATE TABLE [dbo].[TableTest](
[ID] [int] NULL,
[Cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

CREATE SCHEMA Test
GO

CREATE TABLE [Test].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

CREATE VIEW [Test].[ViewTest] as select * from dbo.TableTest
GO

SELECT * FROM [Test].[ViewTest] 
/*
ID          Cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO

DROP TABLE [dbo].[TableTest];
GO
CREATE TABLE [dbo].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

-- この時点から、Test.ViewTest には source、cost、および partnumber 列が含まれている必要があります -- ただし、SELECT * FROM [Test].[ViewTest] を実行すると、SQL Server は同じ「古い」列を表示します。

SELECT * FROM [Test].[ViewTest] 
/*
ID          Cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO

-- 解決策: sp_refreshview

EXEC sp_refreshview 'Test.ViewTest'
GO
SELECT * FROM [Test].[ViewTest] 
/*
source      cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO
于 2013-12-04T19:57:55.357 に答える