愚者の経験

「また今度」はほとんどこない

Viewに全列指定の「*」は使わない[SQL Server]

何かと便利ですがパフォーマンスの観点からよく議題に挙がる全列指定のアスタリスク「*」
列が多い場合、めんどくさくて使ってしまいがちですがSQL ServerのViewにおいては
これで直接列名を取るのはやめたほうがいいです。特に開発中。

パフォーマンスが理由ではなく、「テーブルの変更に追従してこない」からです。
オプションとか探せばあるのかもしれませんが、SQL Server 2008 R2の既定では

1.テーブルを作成し

CREATE TABLE [dbo].[Table_3](
	[int1] [nchar](10) NULL,
	[int2] [nchar](10) NULL,
	[int3] [nchar](10) NULL,
	[int4] [nchar](10) NULL,
	[int5] [nchar](10) NULL
) ON [PRIMARY]

2.Viewを作成(*で全列指定)

CREATE VIEW [dbo].[View_1]
AS
SELECT                  dbo.Table_3.*
FROM                     dbo.Table_3

↓表示するとこんな感じ
2

3.列を追加

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Table_3 ADD
	int6 nchar(10) NULL
GO
ALTER TABLE dbo.Table_3 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

↓デザインで見るとこんな感じ
3

ですがViewを見てみても
2
全く変わりがなくこのままなんです。

テーブルで列を増やして自動的にViewにも現れると思ったらハマります。
実際はViewを保存しなおさない限り(Alterしない限り)、View側の列は変更されないのです。

じゃあ列削除するとどうなるかというと…このようにエラーで開けません。
4

エラー「ビューまたは関数には定義された列数よりも多くの列名が指定されています。」
が発生します。列名はちゃんと指定しましょう。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。