tsql - 以最短的方式将单行查询传递给存储过程的参数
问题描述
我可以用光标来做,但我想知道还有其他方法吗?
例如查询
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
但当然,它不会起作用。那么,还有其他方法可以做到吗?
请注意,程序不能更改。
解决方案
如果您事先知道参数的数量和类型,我会说最简单的解决方案是创建一个以表名作为参数的过程,并将其动态读入本地表,然后您可以使用它来做任何事情。
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 类型,这有点麻烦,所以我更喜欢第一种方法来处理半永久性的东西。
推荐阅读
- python - 用于将行星经度转换为 360 度格式的 python 代码
- excel - 如何在超过 60000 行的文本框中快速显示结果
- c++ - 在 C++ 类中声明 struct 和 typedef 的位置
- tensorflow - 如何在 Tensorflow 中更改保存的模型输入形状?
- node.js - 如何修复 Node 中的“解析错误:意外令牌”?
- angular - 使用值重置的 Angular 6 表单不会更改表单脏状态
- java - 如何在java中取消时间安排的cron作业?
- matlab - 如何在 Matlab 中创建一个矩阵,每个条目都是双变量函数的输出
- firebase - 云函数错误:函数不是有效的特性。必须是数据库、firestore、函数、托管、存储之一
- node.js - 自定义 npm 脚本如何在我的代码中工作?