Thực hành tốt có sử dụng câu lệnh 'goto' trong truy vấn SQL không?Tuyên bố Sql - goto
Trả lời
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ệ.
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.
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.
Đó là một thủ tục được lưu trữ được viết bởi ai đó. – SoftwareGeek
@BhejaFry - Nhưng đó là T-SQL, PL-SQL, MySQL, v.v ...? –
đó là T-SQL, sẽ không hỗ trợ pl-sql goto? – SoftwareGeek
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.
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! ;-) –
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
- 1. Tuyên bố GOTO trong C# .NET
- 2. Tuyên bố, tuyên bố, tuyên bố
- 3. SQL Server Trường hợp Tuyên Bố
- 4. SQL bí danh cho SELECT tuyên bố
- 5. SQL - trật tự bằng cách tuyên bố
- 6. Resharper 5 Beta - Tuyên bố Goto (CTRL + Click) không hoạt động
- 7. Trong C tại sao bạn cần một tuyên bố sau một nhãn goto?
- 8. SQL - TRẢ LỜI TRƯỜNG HỢP - WHEN tuyên bố VÀ tuyên bố
- 9. Tuyên bố chèn Mysqli
- 10. DBNull nếu tuyên bố
- 11. IF Tuyên bố nhiều điều kiện, cùng một tuyên bố
- 12. tuyên bố trường hợp có mệnh đề trong sql
- 13. SQL Server, Chọn tuyên bố bên trong một 'trường hợp'
- 14. LINQ to SQL: WHERE trong bản Tuyên Bố
- 15. động SQL (EXECUTE) như điều kiện để NẾU tuyên bố
- 16. Tuyên bố không giống SQL không hoạt động
- 17. Sử dụng biến trong SQL tương tự tuyên bố
- 18. sử dụng số sql trong một tuyên bố trường hợp
- 19. Tuyên bố trường hợp SQL để tăng giá trị
- 20. Tuyên bố LIKE của SQL về Loại ngày giờ
- 21. SQL inline nếu loại tuyên bố câu hỏi
- 22. tuyên bố trường hợp trong mệnh đề where - SQL Server
- 23. Tuyên bố về Trường hợp Sql khi không rỗng
- 24. IF tuyên bố trong ORDER BY khoản của một tuyên bố SELECT trong một SQL Server lưu trữ thủ tục
- 25. switch tuyên bố trong LINQ
- 26. WPF DialogResult tuyên bố?
- 27. Tuyên bố GTK
- 28. Tuyên bố lệnh delphi
- 29. Bootstrap Function Tuyên bố
- 30. C# Tuyên bố rỗng
http://xkcd.com/292/ – ircmaxell
@ircmaxell ý kiến của tôi chính xác. – Meiscooldude
Không có 'GOTO' trong SQL - chỉ T-SQL –