Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server在存储过程中使用EXEC/sp_executesql还是纯SQL?_Sql Server 2008_Stored Procedures - Fatal编程技术网

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范围内的变量返回调用范围,例如:


  • 这不是一个非常有用的示例,但它是执行动态字符串时的常见问题。但更重要的是,您应该只在必要时考虑动态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;