【问题标题】:How to bind parameters on a SQL Server query cursor如何在 SQL Server 查询游标上绑定参数
【发布时间】:2018-11-14 15:27:50
【问题描述】:

甲骨文:

STR_SQL := ' SELECT ... where x = :1 and y = :2';
OPEN RS FOR STR_SQL USING VAR1, VAR2;

Postgres:

STR_SQL := ' SELECT ... where x = $1 and y = $2';
OPEN RS FOR EXECUTE STR_SQL USING VAR1, VAR2;

如何在 SQL Server 中执行此操作?我想要的只是避免多个执行计划

编辑:

在带有@ 的查询中使用变量是否会保留执行计划?

SET @RS  = CURSOR FOR SELECT ... where x = @MY_PROC_PARAMETER 
OPEN @RS;
FETCH NEXT FROM @RS INTO @VRESULT_VALUE;

【问题讨论】:

  • 为什么要在这些数据库中使用游标? SQL 是一种基于集合的语言。根据子查询的结果使用 UPDATE、INSERT 或 SELECT 比编写游标更快(至少 N 倍)并且更容易
  • 您不需要保留执行计划。 SQL Server 缓存它们。 游标在这种情况下也会损害性能,因为 SQL Server 可以缓存整个查询的计划,而游标只允许缓存 SELECT 部分。
  • 无论如何,副本显示了如何声明游标,但正确的查询会更快地执行 lot - 对于 1M 行,它的执行速度可以快 1M 倍

标签: sql sql-server database database-cursor


【解决方案1】:

游标在 SQL Server 或任何循环中表现不佳,因此我会避免使用这些。在 SQL Server 中将参数绑定到动态 SQL 的等效项是 sp_executesql。您也可以构建一个连接的查询字符串并执行它:

declare @x int = 1
declare @y int = 2
declare @sql varchar(max) = 'select * from table where x = ' + cast(@x as varchar) + ' and y = ' + cast(@y as varchar)
print @sql
--exec @sql

需要对日期、数字和其他数据类型进行强制转换,以将+ 视为连接而不是算术。

但是,如果您真的只是想要一个新的查询执行计划,您可以添加查询提示OPTION(RECOMPILE)。通常没有必要这样做。如果你得到了糟糕的计划,你应该调查为什么你会得到这些。即统计、参数嗅探等。

【讨论】:

  • sp_executesql 将执行查询,而不是创建游标
  • 是的,但这只会执行查询,但我想针对其他问题迭代结果
  • 正确的@PanagiotisKanavos 但这里不需要光标来简单地绑定参数。我知道游标或循环在其他 RDMS(如 Informix)中的表现不同,但无法与 postgres 或 Oracle 对话,因此认为不需要
  • @EnoqueDuarte 为什么你想要迭代?为什么要使用游标?您要解决的实际问题是什么?光标几乎永远不是答案,除非问题是how do I delete 1M rows in batches
  • @EnoqueDuarte 这不是答案。报告数据库不使用游标。想象一下使用 1M 行上的循环来计算总和,这是 small 行数
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多