SR0001: Evite la instrucción SELECT * en procedimientos almacenados, vistas y funciones con valores de tablas

Identificador de regla

SR0001

Categoría

Microsoft.Design

Cambio problemático

Poco problemático

Causa

Uno o varios procedimientos almacenados, vistas o funciones con valores de tabla contienen SELECT *.

Descripción de la regla

Si utiliza un carácter comodín en un procedimiento almacenado, una vista o una función con valores de tabla para seleccionar todas las columnas de una tabla o vista, es posible que cambie el número o la forma de las columnas devueltas si cambia la tabla o la vista subyacente. La forma de una columna es una combinación de su tipo y tamaño. Esta varianza podría producir problemas en aplicaciones que utilizan el procedimiento almacenado, la vista o la función con valores de tabla porque esos consumidores esperarán un número diferente de columnas.

Cómo corregir infracciones

Puede proteger los consumidores del procedimiento almacenado, la vista o la función con valores de tabla frente a los cambios del esquema si reemplaza el carácter comodín con una lista completa de nombres de columna. Puede expandir fácilmente el carácter comodín utilizando la refactorización. Para obtener más información, vea Expandir caracteres comodín en instrucciones SELECT.

Cuándo suprimir advertencias

Al corregir los problemas que esta regla identifica, evita futuras interrupciones en las aplicaciones que confían en su código. Esta advertencia no se debe suprimir.

Ejemplo

El siguiente ejemplo define primero una tabla que se denomina [Table2] y, a continuación, define dos procedimientos almacenados. El primer procedimiento contiene SELECT *, lo que infringe la regla SR0001. El segundo procedimiento evita SELECT * y muestra explícitamente las columnas de la instrucción 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

Vea también

Conceptos

Expandir caracteres comodín en instrucciones SELECT

Analizar el código de base de datos para mejorar la calidad del código