2016-09-12 44 views
1

我忙於重寫SQL Server 2014s TSQL的一些PostgreSQL存儲過程/函數。TSQL過程返回多行數據

我努力從這個存儲過程返回我的值,但這只是一個測試,但我試圖在這種情況下返回多行數據爲兩個變量si_code和co_desc。

我有我的順序(測試)

if (object_id('p_get_serial')) is not null 
    drop procedure p_get_serial 
go 

create procedure p_get_serial(@par01 char(20), @par02 integer) 
as 

    declare 
     @co_num integer, 
     @co_desc char(20), 
     @si_code char(20), 
     @log char(40) 

    declare mycur cursor for 
     select co_num, co_desc 
     from colours 
     where co_num <= @par02 

    open mycur 
    fetch next from mycur into @co_num, 
           @co_desc 

    while @@FETCH_STATUS = 0 
    begin 

     set @si_code = '' 

    select @si_code = si_code 
     from sitems 
     where si_co_num = @co_num 

     set @log = @co_desc + ' ' + @si_code 
     raiserror(@log,0,1) with nowait 

     fetch next from mycur into @co_num, @co_desc 

    end 
    close mycur deallocate mycur 

go 

exec p_get_serial @par01 = 'paramater01', @par02 = 10 

的是返回結果我知道會有多行的最好方法如下?

+0

你應該顯示你的輸入表和所需的輸出,它看起來像你不應該使用遊標(他們是最後的手段)。無條件的恐怖犯罪的意圖是什麼? –

+0

在這個例子中,我不需要光標這只是一個測試,真正的過程太複雜,沒有光標 – Trent

+0

你也可以考慮一個函數,輸出一個表。但是如果SP是唯一的方法 - 創建/定義一個表變量並在sp的末尾輸出。另外 - 通常遊標在sql-server中是「糟糕的」(糟糕的整體性能)。如果你能找到一種避免遊標的方法,你將會獲得更好的性能。 – ripvlan

回答

1

在T-SQL中,您不需要聲明遊標。只需select你需要什麼,它將提供給客戶端應用程序。

遊標是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 
+0

我無法通過單一選擇獲得所需的結果,我嘗試重新創建的過程涉及更多 – Trent

+0

您可以設計自己喜歡的程序但我只是向您展示您的技術將不得不在MS SQL下使用:最終的'select'將結果集返回給客戶端。任何構建該數據集的處理都完全取決於您。但也要記住,如果你不需要結果集,你也可以https://technet.microsoft.com/en-us/library/ms187004%28v=sql.105%29.aspx – ajeh

+0

這正是我需要感謝一堆 – Trent

0

所有你需要做的是,只保存每一行的數據在一個臨時表或表變量,只寫SELECT語句在存儲過程結束時。 你的問題並不清楚你需要什麼,你有一個遊標和while循環,他們似乎是多餘的