我有一个简单的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运行并传递参数会更好吗?我问的是因为查询缓存和我正在使用的参数。
谢谢! 添
答案 0 :(得分:2)
在此处查看没有理由使用动态SQL。当做需要使用动态SQL时,您应该优先考虑sp_executesql
,而不是EXEC()
。原因有很多,包括:
sp_executesql
更有可能重复使用查询计划(请参阅Dynamic SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL));
将强类型参数传递到sp_executesql
要容易得多(比连接字符串更能阻止SQL注入);和,
您还可以将动态SQL范围内的变量返回到调用范围,例如:
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,而不是作为第一手段。