Man*_*ngo 5 sql-server prepared-statement
如何在 SQL Server 中创建和使用准备好的语句?
在 PostgreSQL 中,您可以执行以下操作:
PREPARE prepared (varchar, varchar, etc) AS
INSERT INTO table(field,field,etc)
VALUES ($1,$2,etc);
EXECUTE (value,value,etc);
Run Code Online (Sandbox Code Playgroud)
在 MySQL 中类似的东西。
我在 SQL Server 中找不到任何示例。我已经看到了一些使用功能的例子,但我不认为这是同样的事情。
谢谢
Sol*_*zky 10
SQL Server 支持准备好的语句,但您可能很难找到使用它们的示例,因为它们并不是真正必要的。
您可以调用sp_prepare获取句柄,然后将其传递给sp_execute。或者您可以调用sp_prepexec或sp_prepexecrpc,它们都结合了“prepare”和“exec”步骤。在任何情况下,你会通过调用(最终)结束sp_unprepare,传递手柄由归国sp_prepare
,sp_prepexec
和sp_prepexecrpc
。
但是,如前所述,这种模式在 Microsoft SQL Server 中已过时/不必要,因为查询和执行计划是自然缓存的。根据查询文本的哈希值缓存和查找查询。即席查询基于查询的确切全文(二进制比较)进行缓存,包括连接到查询中用于过滤等的值。这些计划不太可能被重用,除非完全相同的查询(关于空白和其他所有内容)再次执行。参数化查询基于不包含参数值的查询文本进行缓存,并且可以重新用于不同的参数值——就像做“准备”时一样。因此,无需调用prepare / exec / unprepare。
如果您使用存储过程sp_executesql
(对于动态 SQL)或来自应用程序代码的正确参数化查询执行查询,则 SQL Server 已经在执行查找以查看该参数化查询是否已被解析和编译(即“准备”)和如果是这样,那么它将使用缓存的信息。
我相信这种模式在 SQL Server 中最广泛使用的是 ODBC 驱动程序。在编写可以本地连接到 SQL Server 的应用程序时,人们不会使用这种模式。事实上,我建议不要使用这种模式(只要有可能),因为它有每个会话占用更多内存的缺点:它存储查询定义,以便在执行计划的情况下可以重新生成执行计划,例如不管什么原因,从计划缓存中删除。有关此行为的更多详细信息,包括示例 .NET/C# 代码,请参阅我在 DBA.StackExchange 上的其他答案:
使用 SqlCommand.Prepare() 的意义和好处是什么?
归档时间: |
|
查看次数: |
13533 次 |
最近记录: |