代码之家  ›  专栏  ›  技术社区  ›  SoftwareGeek

Sql-goto语句

  •  11
  • SoftwareGeek  · 技术社区  · 14 年前

    在SQL查询中使用goto语句是一种好的做法吗?

    5 回复  |  直到 7 年前
        1
  •  11
  •   Nate    14 年前

    取决于SQL—有些方言除了GOTO之外,没有为流控制提供有用的机制。

    转到通常是不好的形式。

        2
  •  9
  •   Gary Thomann    13 年前

    不在生产代码中,但用于测试就可以了。

    例如,希望为存储过程提供回归测试,其中“公共位”是对被测试过程的调用和调试语句。

    declare @test int;
    set @test = 1;
    goto tests
    
    common:
    print "common bit"
    
    tests:
    if @test = 1 print "1";
    if @test = 2 print "2";
    if @test = 3 print "3";
    
    set @test = @test + 1;
    if @test <= 3 goto common
    print "finished " + cast(@test as varchar(5))
    go  -- goto can not be used past go!
    

    作为一个t-sqlnoob,我希望在范围内声明过程或函数来执行“公共位”,但这是我在google搜索了很多次之后所能想到的最好方法。为什么要为要重用的每一位代码设置一个存储过程。尤其是非生产性工作。

        3
  •  3
  •   Justin Niessner    14 年前

    不。

    与其他语言一样,使用Goto几乎总是有更好的选择。

    如果您告诉我们您使用的是哪个SQL包,以及您要完成的任务,我们可能会告诉您哪些是合适的。

        4
  •  0
  •   Meiscooldude    14 年前

    我的猜测是否定的。在任何现代语言中,我对goto语句的一般规则是,如果你使用它们,你的设计就有问题。

        5
  •  0
  •   Dhananjay Patil    7 年前

    转到 是具有自身特征的关键字。 当需要直接跳到某个级别时,我们可以使用goto。

    在我的存储过程中,我需要处理4个临时表中的数据。 在temp表中插入记录之后的每一级,我都需要检查这个temp表中是否存在记录,如果没有插入任何记录,那么我可以使用goto直接跳转而不是进一步处理。

     CREATE TABLE #tmpMsNos (custPo CHAR(24))
    
        CREATE TABLE #tmpValidBilltos (billto CHAR(12))
    
        CREATE TABLE #tmpOrders (
            fh_pkey INT
            ,fh_id CHAR(8)
            ,custPo CHAR(24)
            ,lastchOfCustInsert DATETIME
            )
    
        CREATE TABLE #tmpOrdersFiltered (
            fh_pkey INT
            ,fh_id CHAR(8)
            ,custPo CHAR(24)
            ,lastchOfCustInsert DATETIME
            ,onbDate DATETIME
            ,rapDate DATETIME
            )
    
        CREATE TABLE #tmpLoad (
            custPo CHAR(24)
            ,ld_pkey INT
            ,ld_wkpmpn CHAR(25)
            ,lda_barcode VARCHAR(30)
            ,ld_createdOn DATETIME
            ,ReceivedDate DATETIME
            ,DispatchedDate DATETIME
            )
    
    INSERT INTO #tmpMsNos
        SELECT cast(itemValue AS CHAR(24)) 
        FROM dbo.fn_array_to_table(@pMsNos, ',')
    
    IF (
                NOT EXISTS (
                    SELECT 1
                    FROM #tmpMsNos
                    )
                )
        BEGIN
            GOTO label
        END
    INSERT INTO #tmpValidBilltos
        SELECT CONVERT(CHAR(12), xm_doref)
        FROM xmlref x
        WHERE xm_element = 'THD-BoxtruckRequest'
            AND xm_attribute = 'THD-BoxtruckBillto'
    
    IF (
                NOT EXISTS (
                    SELECT 1
                    FROM #tmpValidBilltos
                    )
                )
        BEGIN
            GOTO label
        END
    
    INSERT INTO #tmpOrders
        SELECT fh.fh_pkey
            ,fh.fh_id
            ,fh.fh_custPo
            ,max(coc.ch_dt)
        FROM #tmpMsNos msNos
        INNER JOIN fcfgthd fh ON msNos.custPo = fh.fh_custPo
        INNER JOIN #tmpValidBilltos bt ON bt.billto = fh.fh_bt_id
        LEFT JOIN chofcust coc ON coc.ch_fhpkey = fh.fh_pkey
        WHERE fh.fh_statcode NOT IN (
                98 --CAN
                ,99 --DEL
                )
            AND fh.fh_ship_dt > @startDate
        GROUP BY fh.fh_pkey
            ,fh.fh_id
            ,fh.fh_custPo
    
        IF (
                NOT EXISTS (
                    SELECT 1
                    FROM #tmpOrders
                    )
                )
        BEGIN
            GOTO label
        END
    
    INSERT INTO #tmpOrdersFiltered
        SELECT t.fh_pkey
            ,t.fh_id
            ,t.custPo
            ,t.lastchOfCustInsert
            ,MAX(cocONB.ch_dt)
            ,MAX(cocRAP.ch_dt)
        FROM (
            SELECT tmpO.fh_pkey
                ,tmpo.fh_id
                ,tmpO.custPo
                ,tmpO.lastchOfCustInsert
            FROM #tmpOrders tmpO
            INNER JOIN (
                SELECT custpo
                    ,max(lastchOfCustInsert) AS MaxInserteddate
                FROM #tmpOrders
                GROUP BY custpo
                ) tmpOgrouped ON tmpO.custpo = tmpOgrouped.custpo
                AND tmpO.lastchOfCustInsert = tmpOgrouped.MaxInserteddate
            ) AS t
        LEFT JOIN chofcust cocRAP ON cocRAP.ch_fhpkey = t.fh_pkey
            AND cocRAP.ch_stat = 2 -- RAP --TODO: Add comment with status code like 98, 99 -- CAN, DEL for readability - Paresh
        LEFT JOIN chofcust cocONB ON cocONB.ch_fhpkey = t.fh_pkey
            AND cocONB.ch_stat = 5 -- ONB --TODO: Add comment with status code like 98, 99 -- CAN, DEL for readability - Paresh
        GROUP BY t.fh_pkey
            ,t.fh_id
            ,t.custPo
            ,t.lastchOfCustInsert
    
        --TODO: Take an exit if no order found into #tmpOrdersFiltered table, while taking a early exit make sure it doesn't break the calling code (C#)  - Paresh
        IF (
                NOT EXISTS (
                    SELECT 1
                    FROM #tmpOrdersFiltered
                    )
                )
        BEGIN
            GOTO label
        END
    INSERT INTO #tmpLoad
        SELECT o.custPo
            ,l.ld_pkey
            ,l.ld_wkpmpn
            ,la.lda_barcode
            ,max(coc.ch_dt)
            ,CASE ISNULL(w.xl_date, '')
                WHEN ''
                    THEN o.rapDate
                ELSE w.xl_date
                END AS ReceivedDate
            ,CASE ISNULL(mm.me_ecpkey, '')
                WHEN ''
                    THEN o.ONBDate
                ELSE NULL
                END AS DispatchedDate
        FROM #tmpOrdersFiltered o
        INNER JOIN fcload l ON l.ld_fhpkey = o.fh_pkey
        LEFT JOIN loadanc la ON la.lda_ldpkey = l.ld_pkey
        LEFT JOIN wkxaclog w ON w.xl_ldpkey = l.ld_pkey
        LEFT JOIN multiexceps mm ON mm.me_ldpkey = l.ld_pkey
            AND mm.me_ecpkey = @missingitemexcep
        LEFT JOIN chofcust COC ON coc.ch_ldpkey = l.ld_pkey
            AND coc.ch_stat = 64 -- 64= ILH
        GROUP BY o.custPo
            ,l.ld_pkey
            ,l.ld_wkpmpn
            ,la.lda_barcode
            ,w.xl_date
            ,o.rapDate
            ,mm.me_ecpkey
            ,o.ONBDate