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