SR0001:请避免在存储过程、视图和表值函数中使用 SELECT *

规则 ID

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

请参见

概念

扩展 SELECT 语句中的通配符

分析数据库代码以提高代码质量