SR0001 : Évitez d'utiliser SELECT * dans les procédures stockées, les vues et les fonctions table

Id de la règle

SR0001

Catégorie

Microsoft.CSharp

Modification avec rupture

Modification sans rupture

Cause

Une ou plusieurs de vos procédures stockées, vues ou fonctions tables contiennent SELECT *.

Description de la règle

Si vous utilisez un caractère générique dans une procédure stockée ou dans une fonction affichage ou table pour sélectionner toutes les colonnes dans une table ou une vue, le nombre ou la forme des colonnes retournées peut changer si la table ou la vue sous-jacente change. La forme d'une colonne est la combinaison de son type et de sa taille. Cette variance pourrait provoquer des problèmes dans les applications qui consomment la procédure stockée, la vue ou la fonction table parce que ces consommateurs attendront un nombre différent de colonnes.

Comment corriger les violations

Vous pouvez protéger les consommateurs de la procédure stockée, vue ou fonction table des modifications de schéma en remplaçant le caractère générique par une liste qualifiée complète de noms de colonne. Vous pouvez facilement développer le caractère générique à l'aide de la refactorisation. Pour plus d'informations, consultez Développer les caractères génériques dans les instructions SELECT.

Quand supprimer les avertissements

Lorsque vous résolvez les problèmes que cette règle identifie, vous empêchez de futurs arrêts dans les applications qui reposent sur votre code. Vous ne devez pas supprimer cet avertissement.

Exemple

L'exemple suivant définit en premier une table nommée [Table2] puis définit deux procédures stockées. La première procédure contient un SELECT *, qui viole la règle SR0001. La deuxième procédure évite SELECT * et répertorie explicitement les colonnes dans l'instruction 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

Voir aussi

Concepts

Développer les caractères génériques dans les instructions SELECT

Analyse du code de base de données pour en améliorer la qualité