【发布时间】: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