SR0001:避免在預存程序、檢視表和資料表值函式中使用 SELECT *

RuleId

SR0001

分類

Microsoft.Design

中斷變更

非中斷

原因

您的一個或多個預存程序、檢視或資料表值函式包含 SELECT *。

規則描述

如果在預存程序、檢視或資料表值函式中使用萬用字元,以選取資料表或檢視中的所有資料行,如果基礎資料表或檢視變更,所傳回資料行的數目或形狀也可能變更。 資料行的圖案是其型別和大小的組合。 此差異可能會在使用預存程序、檢視或資料表值函式的應用程式造成問題,因為那些消費者會預期不同的資料行數目。

如何修正違規

您可以用完整的資料行名稱清單取代萬用字元,防止預存程序、 檢視或資料表值函式的消費者發生結構描述變更。 您可以使用重構輕易地展開萬用字元。 如需詳細資訊,請參閱在 SELECT 陳述式中展開萬用字元

隱藏警告的時機

當您修正此規則會識別的問題時,即可防止依賴程式碼的應用程式進一步中斷。 您不應該隱藏這項警告。

範例

下列範例會先定義名為 Table2 的資料表,然後定義兩個預存程序。 第一個程序包含 SELECT *,這違反規則 SR0001。 第二個程序會避免 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 陳述式中展開萬用字元

分析資料庫程式碼以改善程式碼品質