SR0001: Vermeiden Sie die Verwendung von SELECT * in gespeicherten Prozeduren, Sichten und Tabellenwertfunktionen

Regel-ID

SR0001

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Mindestens eine gespeicherte Prozedur, Ansicht oder Tabellenwertfunktion enthält SELECT *.

Regelbeschreibung

Wenn Sie in einer gespeicherten Prozedur, Ansicht oder Tabellenwertfunktion ein Platzhalterzeichen verwenden, um alle Spalten in einer Tabelle oder Ansicht auszuwählen, ändert sich die Anzahl oder die Form der zurückgegebenen Spalten unter Umständen, wenn die zugrunde liegende Tabelle oder Ansicht geändert wird. Die Form einer Spalte ist eine Kombination aus Typ und Größe. Diese Varianz kann Probleme in Anwendungen verursachen, die die gespeicherte Prozedur, Ansicht oder Tabellenwertfunktion nutzen, da diese Consumer eine andere Anzahl von Spalten erwarten.

Behandeln von Verstößen

Sie können Consumer der gespeicherten Prozedur sowie die Ansichts- oder Tabellenwertfunktion vor Schemaänderungen schützen, indem Sie das Platzhalterzeichen durch eine vollqualifizierte Liste von Spaltennamen ersetzen. Sie können das Platzhalterzeichen durch Umgestaltung problemlos erweitern. Weitere Informationen finden Sie unter Erweitern von Platzhalterzeichen in SELECT-Anweisungen.

Wann sollten Warnungen unterdrückt werden?

Wenn Sie die Probleme beheben, die durch diese Regel identifiziert werden, verhindern Sie zukünftige Fehler in den Anwendungen, die den Code benötigen. Diese Warnung sollte nicht unterdrückt werden.

Beispiel

Im folgenden Beispiel wird zuerst eine Tabelle mit der Bezeichnung [Table2] definiert, bevor zwei gespeicherte Prozeduren definiert werden. Die erste Prozedur enthält SELECT *, das gegen Regel SR0001 verstößt. Die zweite Prozedur vermeidet SELECT * und führt die Spalten explizit in der SELECT-Anweisung auf.

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

Siehe auch

Konzepte

Erweitern von Platzhalterzeichen in SELECT-Anweisungen

Analysieren von Datenbankcode zum Verbessern der Codequalität