【问题标题】:Allocate multiple parameters based on similar queries根据相似查询分配多个参数
【发布时间】:2020-10-26 14:59:54
【问题描述】:

在存储过程中,我需要填充一些参数。每个参数的值都基于一个非常相似的查询,除了 where 子句的右手操作数之外,其他都是相同的:

SELECT @param_a = f1 FROM t1 WHERE f2 = 'foo' -- this can be re-written as IN ('foo') so all queries are identical in form
SELECT @param_b = f1 FROM t1 WHERE f2 IN ('bar', 'baz)'
SELECT @param_c = f1 FROM t1 WHERE f2 IN ('qux', 'quux')
[...]

实际的查询要长得多(多个连接的表,而不仅仅是 t1),这使得这看起来是一种非常麻烦的方法。我一直在考虑将参数及其各自的参数存储在这样的临时表中:

param      operand
---------- --------
@param_a   'foo'
@param_b   'bar', 'baz'
@param_c   'qux', 'quux'
[...]

然后用游标遍历临时表,每次动态构建并执行我的查询,看起来像这样:

DECLARE my_cursor CURSOR FOR
SELECT param, operand FROM #my_temp_table

OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @param, @operand

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @sttmt = 'SELECT @param = f1 FROM t1 WHERE f2 IN (@operand)'
  SELECT @sttmt_params = '@operand varchar(max),
                          @paramOUT varchar(max) OUTPUT'
  EXEC sp_executesql @sttmt, 
                     @sttmt_params, 
                     @operand = @operand, 
                     @paramOUT = @param[a/b/c/..] -- Here is where it goes wrong

  FETCH NEXT FROM my_cursor INTO @param, @operand
END
CLOSE my_cursor
DEALLOCATE my_cursor

如图所示,问题是我仍然必须硬编码我的参数名称,所以这不会让我更进一步。但也许我什至没有朝着正确的方向思考,还有另一种方法吗?还是我真的需要为每个参数复制粘贴相同的查询?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以使用条件聚合在单个查询中定义它们,而无需使用游标:

    SELECT @param_a = MAX(CASE WHEN f2 = 'foo' THEN f1 END),
           @param_b = MAX(CASE WHEN f2 IN ('bar', 'baz') THEN f1 END),
           @param_c = MAX(CASE WHEN f2 IN ('qux', 'quux') THEN f1 END)       
    FROM t1 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2012-08-26
      • 2019-02-18
      • 2019-05-13
      • 1970-01-01
      相关资源
      最近更新 更多