SQL Server 中,對結果集及游標的使用[總結]


 

一、對結果集使用的解決辦法

如何在存儲過程中使用另一個存儲過程的結果集,或者對動態SQL語句的執行結果再次使用,可以使用下面這樣的語句:

INSERT INTO table_name EXEC procedure_name @parameters_var

使用代碼如下:

--1 創建一個臨時表#tmp,表結構與目標存儲過程procedure_name的返回結果集兼容(兼容即可,不必相同)。
create table #tmp(
   [columns_list]
)

--2.1 執行存儲過程,並將存儲過程的返回結果集插入臨時表。
insert into #tmp exec procedure_name @parameters_var

--2.2 對於動態sql語句的執行如下(如果直接通過exec執行動態sql語句,sql語句有4k的長度限制。)
insert into #tmp exec dbo.sp_executesql @querystring_var

--3 現在可以使用(過濾,更改或檢索)#tmp了。
if exists(select * from #tmp)
    begin
       --執行分支1
    end 
else 
    begin
       --執行分支2
    end

--4 最后清除臨時表。
drop table #tmp

思路2:創建一個函數返回需要的查詢結果集,然后在存儲過程中當做table使用即可。

參考來源:在存儲過程中如何使用另一個存儲過程返回的結果集


二、對游標的使用嘗試

下面是使用 SQL Server 游標的一個示例。首先,創建測試環境:

create table #tmp( ID int ,UserName varchar(12) )
GO

insert into #tmp values(1,'aaaa');
insert into #tmp values(2,'bbbb');
insert into #tmp values(3,'aabb');
insert into #tmp values(4,'bbaa');
GO

select * from #tmp
GO

使用代碼如下:

alter procedure Demo
as
begin
    declare @tmpID int,@tmpName varchar(12);
    begin try
        -- 注意:有order by不能對select 語句使用括號
        declare cr cursor for select ID,UserName from #tmp order by ID; 
        open cr;
        fetch next from cr into @tmpID,@tmpName;
           -- @@fetch_status 返回當前打開的游標的 FETCH 語句的狀態
        while(@@fetch_status=0)
        begin
           print convert(varchar(6),@tmpID) + @tmpName;
           fetch next from cr into @tmpID,@tmpName; --讀取下一條數據
           if(@tmpName = 'aabb') goto userGO;
        end;

        userGO: print '自定義GOTO語句跳轉';

        close cr;       -- 關閉游標
        deallocate cr;  -- 釋放游標
    end try
    begin catch   
        close cr;       -- 關閉游標
        deallocate cr;  -- 釋放游標
        print '異常處理!'
    end catch
end;

exec Demo

參考 MSDN 資源:http://msdn.microsoft.com/zh-cn/library/ms180169.aspx

(完)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM