首页 > 解决方案 > 以最短的方式将单行查询传递给存储过程的参数

问题描述

我可以用光标来做,但我想知道还有其他方法吗?

例如查询

select a, b, c
from query 
where id = 1

以最短的方式传递给存储过程(不能更改)+不使用游标,并更改“a”列的值

proc test_sp
@a int,
@b int,
@c int
as

select @a + a + 1
from test
where b = @b and c = @c

所以,理想的情况是这样的:

select
(
    exec test_sp @a = a, @b = b, @c = c
    from query 
    where id = 1
) a, b, c
from query 
where id = 1

但当然,它不会起作用。那么,还有其他方法可以做到吗?

请注意,程序不能更改。

标签: tsql

解决方案


如果您事先知道参数的数量和类型,我会说最简单的解决方案是创建一个以表名作为参数的过程,并将其动态读入本地表,然后您可以使用它来做任何事情。

create proc test_sp
@tablename nvarchar(128)
as begin
    declare @sql nvarchar(max)
    set @sql=N'select * from ['+@tablename+']'
    create table #t
    (
        -- define same columns as your "query"
    )
    insert #t
        exec(@sql)
        
    -- now do whatever you want to your #t
end -- proc

因此,您可以将查询保存到表中,然后调用 proc,例如:

select a, b, c
into ##a
from query 
where id = 1

exec test_sp '##a'

请注意,在此示例中,如果您使用#tables,则必须使用双哈希,否则动态 sql 将无法访问它。

结构更好的方法是使用 table 参数,但由于必须在 db 中定义新的 table 类型,这有点麻烦,所以我更喜欢第一种方法来处理半永久性的东西。


推荐阅读