久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

編寫沒有游標的存儲過程

Writing the stored procedure without cursor(編寫沒有游標的存儲過程)
本文介紹了編寫沒有游標的存儲過程的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

可能的重復:
沒有游標的存儲過程

如何在沒有光標的情況下編寫以下sp?.更多的是它沒有給我想要的輸出.這不是我寫的,我是想解釋這有什么問題.

How can I write the following sp without the cursor?. More over its not giving me the desired output. I didn't write this, I am trying to interpret what is wrong with this.

ALTER PROCEDURE [dbo].[AccreditationExpiryCheck]
AS
BEGIN
    SET NOCOUNT ON;

    declare @taskTypeId int = 19 -- Accreditations, automated
    declare @firstActionTypeId int = 23 -- Accreditation expiring
    declare @nextActionTypeId int = 3 -- Call company

    declare @companyId int
    declare @accreditationId int
    declare @comment nvarchar(max) = N' accreditation for this company has expired.'

    -- find all companies and accreditations expiring
    declare companies cursor local forward_only read_only for 
        select c.Company_Id, a.Accred_ID
        from COMPANY c
            inner join MEMBERSHIP m on c.Company_ID = m.Company_ID
            inner join ACCREDITATION a on c.Company_ID = a.Company_ID
        where
            -- Accreditation expired yesterday
            cast(a.Accred_ExpDate as DATE) = cast(DATEADD(DAY, -1, GETDATE()) as DATE)
            and m.IsMember_Ind = 1
            and (c.HQ_ID IS NULL OR c.HQ_ID = c.Company_ID)  -- FB4640: this isn't a 'team' co (with an HQ)
            -- and there is no action of this type created within 1 day
            -- of the expiry date
            and not exists (
                select * from TaskAction ta where
                    ta.FirstActionTypeId = @firstActionTypeId and
                    ta.TaskTypeId = @taskTypeId and
                    ta.TaskCreatedOn BETWEEN a.Accred_ExpDate AND DATEADD(DAY, 1, a.Accred_ExpDate) and
                    ta.EntityId = c.Company_ID and 
                    ta.EntityTypeId = 1 )

    open companies

    fetch next from companies into @companyId, @accreditationId

    declare @title nvarchar(max) = 
        (select AccredType_Name from ACCREDITATION_TYPE at 
        inner join ACCREDITATION a on at.AccredType_ID = a.AccredType_ID
        where a.Accred_ID = @accreditationId)

    declare @comment2 nvarchar(max) = isnull(@title, '') + ' accreditation for this company has expired.'
    while @@FETCH_STATUS = 0
    begin
        exec CreateSystemTask 
            @taskTypeId, 
            @firstActionTypeId,
            @nextActionTypeId,
            @companyid,
            @comment2,
            @title

        fetch next from companies into @companyId,@accreditationId
    end

    close companies
    deallocate companies
END

來自上述 sp 的以下 select 語句為我提供了正確的數(shù)據(jù)集,但循環(huán)遍歷的光標為我提供了不同的輸出.

The following select statement from the above sp gives me the correct dataset, but the cursor which loops through gives me a different output.

select c.Company_Id, a.Accred_ID
        from COMPANY c
            inner join MEMBERSHIP m on c.Company_ID = m.Company_ID
            inner join ACCREDITATION a on c.Company_ID = a.Company_ID
        where
            -- Accreditation expired yesterday
            cast(a.Accred_ExpDate as DATE) = cast(DATEADD(DAY, -1, GETDATE()) as DATE)
            and m.IsMember_Ind = 1
            and (c.HQ_ID IS NULL OR c.HQ_ID = c.Company_ID)  -- FB4640: this isn't a 'team' co (with an HQ)
            -- and there is no action of this type created within 1 day
            -- of the expiry date
            and not exists (
                select * from TaskAction ta where
                    ta.FirstActionTypeId = @firstActionTypeId and
                    ta.TaskTypeId = @taskTypeId and
                    ta.TaskCreatedOn BETWEEN a.Accred_ExpDate AND DATEADD(DAY, 1, a.Accred_ExpDate) and
                    ta.EntityId = c.Company_ID and 
                    ta.EntityTypeId = 1 )

推薦答案

您可以使用 while 循環(huán)擺脫光標,如下圖所示.如果您查詢的數(shù)據(jù)包含一個唯一標識符,您可以取消臨時表,但在您的示例中,我使用了一個臨時表并包含了一個 recordId.

You can get rid of the cursor with a while loop as illustrated below. If the data you are querying included a unique identifier you could do away with the temp table but for your example I used a temp table and included a recordId.

ALTER PROCEDURE [dbo].[AccreditationExpiryCheck] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    declare @taskTypeId int = 19 -- Accreditations, automated 
    declare @firstActionTypeId int = 23 -- Accreditation expiring 
    declare @nextActionTypeId int = 3 -- Call company 

    declare @companyId int 
    declare @accreditationId int 
    declare @comment nvarchar(max) = N' accreditation for this company has expired.'

    -- find all companies and accreditations expiring 
    select ROW_NUMBER() OVER(ORDER BY c.Company_Id, a.Accred_ID) as [RecordId], c.Company_Id as [Company_Id], a.Accred_ID as [Accred_ID]
    into #COMPANIES
        from COMPANY c 
            inner join MEMBERSHIP m on c.Company_ID = m.Company_ID 
            inner join ACCREDITATION a on c.Company_ID = a.Company_ID 
        where 
            -- Accreditation expired yesterday 
            cast(a.Accred_ExpDate as DATE) = cast(DATEADD(DAY, -1, GETDATE()) as DATE) 
            and m.IsMember_Ind = 1 
            and (c.HQ_ID IS NULL OR c.HQ_ID = c.Company_ID)  -- FB4640: this isn't a 'team' co (with an HQ) 
            -- and there is no action of this type created within 1 day 
            -- of the expiry date 
            and not exists ( 
                select * from TaskAction ta where 
                    ta.FirstActionTypeId = @firstActionTypeId and 
                    ta.TaskTypeId = @taskTypeId and 
                    ta.TaskCreatedOn BETWEEN a.Accred_ExpDate AND DATEADD(DAY, 1, a.Accred_ExpDate) and 
                    ta.EntityId = c.Company_ID and  
                    ta.EntityTypeId = 1 )

    declare @recordId int = 0;
    declare @title nvarchar(max);
    declare @comment2 nvarchar(max);

    while(1=1)
        begin
            select top 1 @recordId = [RecordId]
                        ,@companyId = [CompanyId]
                        ,@accreditationId = [Accred_ID]
            from #COMPANIES
            where [RecordId] > @recordId

            if @@ROWCOUNT = 0 break;

            set @title =  
                (select AccredType_Name from ACCREDITATION_TYPE at  
                inner join ACCREDITATION a on at.AccredType_ID = a.AccredType_ID 
                where a.Accred_ID = @accreditationId) 

            set @comment2 = isnull(@title, '') + ' accreditation for this company has expired.' 

                exec CreateSystemTask  
                    @taskTypeId,  
                    @firstActionTypeId, 
                    @nextActionTypeId, 
                    @companyid, 
                    @comment2, 
                    @title        
        end 

    drop table #COMPANIES 
END 

這篇關于編寫沒有游標的存儲過程的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

Modify Existing decimal places info(修改現(xiàn)有小數(shù)位信息)
The correlation name #39;CONVERT#39; is specified multiple times(多次指定相關名稱“CONVERT)
T-SQL left join not returning null columns(T-SQL 左連接不返回空列)
remove duplicates from comma or pipeline operator string(從逗號或管道運算符字符串中刪除重復項)
Change an iterative query to a relational set-based query(將迭代查詢更改為基于關系集的查詢)
concatenate a zero onto sql server select value shows 4 digits still and not 5(將零連接到 sql server 選擇值仍然顯示 4 位而不是 5)
主站蜘蛛池模板: 成人av网站在线观看 | 日韩国产免费观看 | 亚洲精品亚洲人成人网 | 免费av直接看 | 96国产精品久久久久aⅴ四区 | 黄色一级大片在线免费看产 | 亚洲欧美综合网 | 久久亚洲国产 | 91久久国产综合久久91精品网站 | 国产日韩欧美激情 | 国产精品99久久久久 | 日本一区二区高清不卡 | 日韩在线观看一区 | av网站在线看 | 国产精品99视频 | 国产xxxx岁13xxxxhd | 天天搞天天操 | 婷婷精品| 九九综合 | 乳色吐息在线观看 | 国产一级毛片视频 | 亚洲精选久久 | 日日摸日日碰夜夜爽2015电影 | 日本黄色免费大片 | 久久99精品久久久久 | 国产精品视频网 | 国产精品久久久久久久久久久免费看 | 成人免费视频在线观看 | 亚洲日本乱码在线观看 | 成人激情视频免费观看 | 伊人春色成人 | 亚洲免费在线观看 | 免费在线观看一区二区 | 在线91 | 日韩精品在线看 | 国产成人在线视频免费观看 | 九九看片 | 美美女高清毛片视频免费观看 | 日韩伦理一区二区三区 | 91精品久久久久久久久 | 在线免费小视频 |