在SQL查詢中使用'goto'語句是否是一種好的做法?sql-goto語句
回答
取決於SQL--一些方言不提供GOTO以外流量控制的有用機制。
GOTO通常是不好的形式。
我的猜測是否定的。我使用任何現代語言的goto語句的一般規則是,如果您使用它們,那麼您的設計出現問題。
號
與其他語言中,幾乎總是一個更好的選擇比轉到使用。
如果您告訴我們您正在使用哪個SQL軟件包以及您想要完成的工作,我們可能會爲您提供一個確切的解決方案。
這是一個由某人編寫的存儲過程。 – SoftwareGeek 2010-06-15 15:38:48
@BhejaFry - 但它是T-SQL,PL-SQL,MySQL等嗎? – 2010-06-15 18:34:28
它是T-SQL,會不會pl-sql支持goto? – SoftwareGeek 2010-06-16 01:15:44
沒有在生產代碼,但測試可能是好的。
例如,希望爲存儲過程提供迴歸測試,其中「常用位」是對正在測試的過程和調試語句的調用。
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-SQL小白我希望的過程或函數範圍內聲明做了「公共位」,但是,這是我能想出經過多次使用Google最好的。爲什麼你需要爲你想要重複使用的每一位代碼設置一個存儲過程。特別適用於非生產性工作。
您在使用GOTO使用小功能時提出了一個很好的觀點。 :-)我們需要T-SQL中的Lambda表達式! ;-) – 2013-07-26 12:42:55
goto是關鍵字有它自己的功能。 只要需要跳轉到某個級別,我們就可以使用goto。
讓我們看看例子... 在我的存儲過程中,我需要使用4個臨時表中的數據。 在臨時表中插入記錄之後,我需要檢查記錄是否存在於此臨時溫度中,如果沒有記錄插入,而不是進一步處理,我可以使用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
- 1. SQL語句選擇語句
- 2. Switch語句VS If語句
- 3. Where語句ORDER BY語句
- 4. 與case語句SELECT語句
- 5. 算術語句if語句
- 6. if語句中的語句
- 7. SQL語句中加入語句後的case語句
- 8. objective c - Break語句不在循環語句或switch語句中
- 9. 如果語句嵌套if if語句嵌套if語句,
- 10. SQL語句中的Where語句中的IF語句
- 11. Break語句不在循環語句或switch語句中?
- 12. if語句將所有語句分組爲一個語句
- 13. 短語SQL語句
- 14. 連續語句中的if語句
- 15. if語句中if語句的條件
- 16. 否定語句#可用語句
- 17. 在IF語句中嵌套Case語句
- 18. C# - 語句在switch語句中
- 19. php if語句裏面的語句
- 20. 在「With」語句中使用「IF」語句
- 21. UNION語句頂部的SELECT語句
- 22. JavaScript新語句如果語句故障
- 23. if語句後的多個語句
- 24. 'for'語句中的'If'語句
- 25. 陷入while語句中的if語句
- 26. 在case語句中選擇語句sql
- 27. 在mysql語句中使用if語句
- 28. SQL - case語句 - 當語句,並聲明
- 29. 使用try catch語句打印語句
- 30. 在if語句中使用where語句
http://xkcd.com/292/ – ircmaxell 2010-06-15 14:18:41
@ircmaxell我的情緒。 – Meiscooldude 2010-06-15 14:20:07
SQL中沒有'GOTO' - 只有T-SQL – 2017-03-10 06:52:47