SR0001: ストアド プロシージャ、ビュー、およびテーブル値関数で SELECT * を使用することは避けてください。

規則 ID

SR0001

分類

Microsoft.Design

互換性に影響する変更点

なし

原因

1 つまたは複数のストアド プロシージャ、ビュー、またはテーブル値関数に、SELECT * が含まれています。

規則の説明

テーブルやビューのすべての列を選択するために、ストアド プロシージャ、ビュー、またはテーブル値関数でワイルドカード文字を使用する場合、戻り値として返される列の数や形状が、基となるテーブルやビューの変更に伴って変わる可能性があります。 列の形状は、種類とサイズの組み合わせで決まります。 ストアド プロシージャ、ビュー、またはテーブル値関数を利用するアプリケーションが予期する列数と、戻り値として返される列数とが異なると、そのアプリケーションで問題が発生する場合があります。

違反の修正方法

ストアド プロシージャ、ビュー、またはテーブル値関数を利用するアプリケーションでスキーマの変更による問題が発生しないようにするには、ワイルドカード文字を列名の完全修飾リストで置き換えます。 リファクタリングを使用すると、ワイルドカード文字を簡単に展開できます。 詳細については、「SELECT ステートメントでのワイルドカード文字の展開」を参照してください。

警告を抑制する状況

この規則によって識別される問題を修復すると、コードに依存するアプリケーションで将来問題が発生することを回避できます。 この警告は抑制しないでください。

使用例

次の例では、まず [Table2] という名前のテーブルを定義し、次に 2 つのストアド プロシージャを定義します。 最初のプロシージャには SELECT * が含まれていて、規則 SR0001 に違反しています。 2 番目のプロシージャでは SELECT * を使用せずに、SELECT ステートメントで明示的に列を指定します。

CREATE TABLE [dbo].[Table2] 
( 
[ID] INT NOT NULL IDENTITY(0, 1), 
[c1] INT NOT NULL , 
[Comment] VARCHAR (50)
)
ON [PRIMARY]

CREATE PROCEDURE [dbo].[procWithWarning]
AS 
BEGIN
-- Contains code that breaks rule SR0001
SELECT * 
FROM [dbo].[Table2] 
END

CREATE PROCEDURE [dbo].[procFixed]
AS 
BEGIN
-- Explicitly lists the column names in a SELECT statement
SELECT [dbo].[Table2].[ID], [dbo].[Table2].[c1], [dbo].[Table2].[Comment]
FROM [dbo].[Table2] 
END

参照

概念

SELECT ステートメントでのワイルドカード文字の展開

データベース コードの分析によるコードの品質の向上