次の方法で共有


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

RuleId

SR0001

カテゴリ

Microsoft.Design

互換性に影響する変更点

なし

原因

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

規則の説明

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

違反の修正方法

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

警告を抑制する状況

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

使用例

次の例では、[Table2] という名前のテーブルを定義した後、2 つのストアド プロシージャを定義します。 最初のプロシージャには、規則 SR0001 に違反する SELECT * が含まれています。 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 ステートメントでワイルドカード文字を展開する

スタティック分析によるデータベース コードの改善