2010-06-15 48 views

Trả lời

8

Phụ thuộc vào SQL - một số phương ngữ không cung cấp cơ chế hữu ích cho điều khiển luồng ngoài GOTO.

GOTO thường có dạng không hợp lệ.

0

Tôi đoán là không. Quy tắc chung của tôi với các câu lệnh goto bằng bất kỳ ngôn ngữ hiện đại nào, nếu bạn sử dụng chúng, có điều gì đó sai với thiết kế của bạn.

3

số

Như với các ngôn ngữ khác, hầu như luôn có tùy chọn tốt hơn để sử dụng hơn Goto.

Nếu bạn cho chúng tôi biết Gói SQL bạn đang sử dụng và những gì bạn đang cố gắng hoàn thành, chúng tôi có thể cung cấp cho bạn ý tưởng chính xác có thể phù hợp.

+0

Đó là một thủ tục được lưu trữ được viết bởi ai đó. – SoftwareGeek

+0

@BhejaFry - Nhưng đó là T-SQL, PL-SQL, MySQL, v.v ...? –

+0

đó là T-SQL, sẽ không hỗ trợ pl-sql goto? – SoftwareGeek

5

Không có trong mã sản xuất nhưng để thử nghiệm có thể là ok.

Ví dụ, muốn cung cấp kiểm tra hồi quy cho một thủ tục được lưu trữ trong đó "bit chung" là lời gọi đến quy trình đang được kiểm tra và báo cáo gỡ lỗi.

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! 

Là một Noob t-sql Tôi đã hy vọng cho thủ tục hoặc chức năng để khai báo trong phạm vi để thực hiện "chút chung" nhưng đây là tốt nhất mà tôi có thể đưa ra googling sau nhiều. Tại sao bạn phải thiết lập một thủ tục được lưu trữ cho mỗi bit mã bạn muốn sử dụng lại. Đặc biệt là cho công việc không sản xuất.

+0

Bạn có một điểm tuyệt vời về việc sử dụng các bit nhỏ của chức năng sử dụng GOTO. :-) Chúng ta cần các biểu thức Lambda trong T-SQL! ;-) –

0

goto là từ khóa có tính năng riêng. Chúng tôi có thể sử dụng goto bất cứ khi nào nó được yêu cầu để nhảy trực tiếp đến một số cấp độ.

Cho phép lấy ví dụ ... Trong thủ tục được lưu trữ của tôi, tôi cần làm việc với dữ liệu trong 4 bảng tạm thời. ở mọi cấp độ sau khi chèn bản ghi trong bảng tạm thời Tôi cần kiểm tra xem bản ghi có hiện diện trong temp tạm thời này hay không, nếu không có bản ghi nào được chèn vào thay vì xử lý thêm nữa, tôi có thể trực tiếp chuyển xuống bằng goto. Nhãn là điểm chúng ta nên nhảy:

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 
Các vấn đề liên quan