Sql server 2008 SQL Server在存储过程中使用EXEC/sp_executesql还是纯SQL?
我有一个简单的存储过程,为实现最佳查询缓存/优化,最好的编码方式是什么 我现在有它如下Sql server 2008 SQL Server在存储过程中使用EXEC/sp_executesql还是纯SQL?,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我有一个简单的存储过程,为实现最佳查询缓存/优化,最好的编码方式是什么 我现在有它如下 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, OccupierTyp
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运行并传递参数是否更好?我这样问是因为查询缓存和我使用的参数
谢谢大家!!
Tim看不到在这里使用动态SQL的理由。当您确实需要使用动态SQL时,您应该优先考虑<代码> SPEXECUTESQL>代码> > >高于代码>执行()/<代码>。原因有很多,包括:
sp_executesql
更有可能重用查询计划(请参阅)sp_executesql
(比串接字符串更好地阻止SQL注入)要容易得多;以及这不是一个非常有用的示例,但它是执行动态字符串时的常见问题。但更重要的是,您应该只在必要时考虑动态SQL,而不是作为第一种手段。两者都将存储为参数化查询。你认为这会有什么不同?这正是我想知道的。。。我曾试图在互联网上找到这一点,因为在某个地方,我觉得我必须使用sp_executesql进行最佳实践,但我真的不想相信这一点。这证实了我的希望,谢谢!顺便说一句,我正在自己为一家公司编写我的第一个程序,我正在努力学习每一个“最佳实践”的东西,这样我就不会在以后看我的代码时后悔我所做的一切……在这种情况下,我看不到使用
sp_executesql
有任何好处。只要您使用参数化查询来避免SQL注入(这就是您已经在做的!),您就可以了——只需在存储的进程中使用“普通”SQL即可。另一种使此特定查询更可预测的方法是:不使用TOP
而不使用ORDER BY
。还有为什么设置为NOCOUNT ON
被注释掉了?
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;