SR0001: Evite selecionar * em procedimentos armazenados, exibições e funções com valor de tabela

RuleId

SR0001

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável

Causa

Um ou mais dos seus procedimentos armazenados, modos de exibição ou funções com valor de tabela contém SELECT *.

Descrição da regra

Se você usar um caractere curinga em um procedimento armazenado, o modo de exibição ou a função table valued para selecionar todas as colunas em uma tabela ou modo de exibição, o número ou a forma de colunas retornadas pode mudar se altera a tabela ou modo de exibição base. A forma de uma coluna é uma combinação de seu tipo e tamanho. Essa variação pode causar problemas em aplicativos que consomem o procedimento armazenado, modo de exibição ou função table valued porque os consumidores esperam um número diferente de colunas.

Como corrigir violações

Você pode proteger os consumidores do procedimento armazenado, modo de exibição ou função table valued contra alterações de esquema, substituindo o caractere curinga com uma lista totalmente qualificada de nomes de coluna. Você pode expandir facilmente o caractere curinga usando a refatoração. Para obter mais informações, consulte Expanda os caracteres curinga nas instruções SELECT.

Quando suprimir avisos

Quando você corrigir os problemas que identifica a essa regra, você pode impedir quebras futuras dos aplicativos que dependem de seu código. Você não deve suprimir esse aviso.

Exemplo

Primeiro, o exemplo a seguir define uma tabela que é denominada [Tabela2] e, em seguida, define dois procedimentos armazenados. O primeiro procedimento contém um SELECT *, que viola a regra SR0001. O segundo procedimento evita selecionar * e explicitamente relaciona as colunas na instrução 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

Consulte também

Conceitos

Expanda os caracteres curinga nas instruções SELECT

Analisando o código do banco de dados para melhorar a qualidade do código