SQL Server在存储过程中使用EXEC / sp_executesql还是只是普通的sql?

时间:2011-08-26 20:04:27

标签: sql-server-2008 stored-procedures

我有一个简单的sproc,为最佳查询缓存/优化编写代码的最佳方法是什么?

我目前的情况如下。

ALTER PROCEDURE dbo.OccupierGet

(
@OccupierID int = 0
)

AS
/* SET NOCOUNT ON */
--Get all details that can be editted.
select TOP 1 ID,AccountNumber,FirstName,LastName,Company,Telephone,Notes,
OccupierTypeID,Address,Address2,City,Country,Telephone2,HomePhone,CellPhone,WorkPhone,Fax,EmailAddress 
from dbo.Occupier
where ID = @OccupierID

RETURN

将sql查询构建为字符串并使用sp_executesql运行并传递参数会更好吗?我问的是因为查询缓存和我正在使用的参数。

谢谢! 添

1 个答案:

答案 0 :(得分:2)

在此处查看没有理由使用动态SQL。当需要使用动态SQL时,您应该优先考虑sp_executesql,而不是EXEC()。原因有很多,包括:

  1. sp_executesql更有可能重复使用查询计划(请参阅Dynamic SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL));

  2. 将强类型参数传递到sp_executesql要容易得多(比连接字符串更能阻止SQL注入);和,

  3. 您还可以将动态SQL范围内的变量返回到调用范围,例如:

  4. DECLARE @i INT, @sql NVARCHAR(MAX), @dbname SYSNAME = N'model';
    
    SET @sql = N'SELECT @i = COUNT(*) FROM ' 
        + @dbname + '.sys.tables;' 
    
    EXEC sp_executesql @sql, N'@i INT OUTPUT', @i = @i OUTPUT;
    
    PRINT @i;
    

    这不是一个非常有用的示例,但在执行动态字符串时这是一个常见问题。但更重要的是,您应该只考虑动态SQL,而不是作为第一手段。