Sql server 返回多行数据的TSQL过程

Sql server 返回多行数据的TSQL过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正忙于为SQLServer2014STSQL重写一些PostgreSQL存储过程/函数 我正在努力从这个存储过程返回我的值,虽然这只是一个测试,但我正在尝试返回多行数据,在这种情况下,这两个变量是si_code和co_desc 我的程序如下(作为测试) 如果(object_id('p_get_serial')不是null 丢弃程序p_获取_序列 去 创建过程p_get_serial(@par01 char(20),@par02 integer) 作为 声明 @co_num整数, @co_des

我正忙于为SQLServer2014STSQL重写一些PostgreSQL存储过程/函数

我正在努力从这个存储过程返回我的值,虽然这只是一个测试,但我正在尝试返回多行数据,在这种情况下,这两个变量是si_code和co_desc

我的程序如下(作为测试)

如果(object_id('p_get_serial')不是null
丢弃程序p_获取_序列
去
创建过程p_get_serial(@par01 char(20),@par02 integer)
作为
声明
@co_num整数,
@co_desc char(20),
@si_代码字符(20),
@日志字符(40)
将mycur游标声明为
选择co_num,co_desc
从颜色

在T-SQL中,co_num不需要声明游标。只需
选择所需内容,即可在客户端应用程序中使用

游标是Oracle/DB2/PostgreSQL等返回数据的方式。SQL Server不需要它

create procedure p
as
    select 1 as a
返回包含一条记录和一列的记录集

create procedure p
as
    select 1 as a, 'a' as b
    union select 2, 'b'
返回两行,每行有两列

返回结果集之前更复杂的处理示例:

create procedure p
as
begin
    declare @a int, @b varchar(10)

    select @a = 1
    select @b = convert(varchar(10), @a)

    select @a = @a + 1

    select @a as a, @b as b -- this will be the resultset returned to the client
end

只需将每一行的数据保存在临时表或表变量中,并在存储过程的末尾编写SELECT语句即可。
你的问题不清楚你到底需要什么,你有一个游标和while循环,它们似乎是多余的

你应该显示你的输入表和所需的输出,看起来你根本不应该使用游标(它们是最后的手段)。在这个例子中,我不需要光标,这只是一个测试,实际的过程太复杂了,没有一个CURSORE,你也可以考虑一个输出表的函数。但是,如果SP是唯一的方法—创建/定义一个表变量并在SP末尾输出。另外—在sql server中,游标通常是“坏的”(总体性能较差)。如果你能找到一种避免使用游标的方法,你会有更好的性能。我无法通过一次选择获得我需要的结果,我尝试重新创建的过程涉及的问题要多得多。你可以设计你喜欢的复杂过程,我只是向您展示在MS SQL下必须使用的技术:您的最终
select
将结果集返回给客户端。构建该数据集的任何处理都完全取决于您。但也要记住,如果不需要结果集,也可以
create procedure p
as
begin
    declare @a int, @b varchar(10)

    select @a = 1
    select @b = convert(varchar(10), @a)

    select @a = @a + 1

    select @a as a, @b as b -- this will be the resultset returned to the client
end