Hoặc: Điều gì không phải là câu lệnh T-SQL?Khi nào tôi không nên sử dụng dấu chấm phẩy?
Ngoại trừ để giải quyết sự mơ hồ, cú pháp T-SQL không yêu cầu dấu chấm phẩy để chấm dứt câu lệnh. Mặc dù vậy, Itzik Ben-Gan khuyên bạn nên sử dụng dấu chấm phẩy để chấm dứt câu lệnh T-SQL vì nó làm cho mã sạch hơn, dễ đọc hơn, dễ bảo trì hơn và dễ di chuyển hơn.
Tôi không biết định nghĩa chính xác về câu lệnh T-SQL hợp lệ là gì, vì vậy tôi có thể bị nhầm lẫn ở đây. Nhưng theo như tôi biết, BEGIN ... khối END là một câu lệnh T-SQL, vì vậy nên được chấm dứt bằng dấu chấm phẩy. Ví dụ:
IF OBJECT_ID('tempdb.dbo.#TempTable') IS NOT NULL
BEGIN
DROP TABLE #TempTable;
END;
Đoạn mã ví dụ trong Microsoft BEGIN...END documentation hỗ trợ giả thuyết này:
USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
GO
IF @@TRANCOUNT = 0
BEGIN
SELECT FirstName, MiddleName
FROM Person.Person WHERE LastName = 'Adams';
ROLLBACK TRANSACTION;
PRINT N'Rolling back the transaction two times would cause an error.';
END;
ROLLBACK TRANSACTION;
PRINT N'Rolled back the transaction.';
GO
/*
Rolled back the tranaction.
*/
Itzik Ben-Gan mâu thuẫn này trong đoạn mã nguồn của tập thể dục 1-1 của T-SQL Fundamentals:
SET NOCOUNT ON;
USE TSQLFundamentals2008;
IF OBJECT_ID('dbo.Nums', 'U') IS NOT NULL DROP TABLE dbo.Nums;
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @i AS INT = 1;
BEGIN TRAN
WHILE @i <= 100000
BEGIN
INSERT INTO dbo.Nums VALUES(@i);
SET @i = @i + 1;
END
COMMIT TRAN
SET NOCOUNT OFF;
Tài liệu Transact-SQL Syntax Conventions của Microsoft tuyên bố rằng dấu chấm phẩy "sẽ được yêu cầu trong phiên bản tương lai" của T-SQL.
Bình luận về ý định của Microsoft để yêu cầu chấm phẩy trong một phiên bản tương lai của T-SQL, Itzik ghi nhận một số trường hợp ngoại lệ mà không phải là nghĩa vụ phải được chấm dứt:
So far it was a requirement to use a semicolon only in specific cases. Now it looks like the plan is to make it a required terminator for all* T-SQL statements in some future version of SQL Server.
(*) Naturally there are cases that aren’t supposed to be terminated with a semicolon; those include (but are not limited to):
BEGIN
BEGIN TRAN
IF
ELSE
WHILE
BEGIN TRY
END TRY
BEGIN CATCH
Itzik có vẻ là phù hợp với bản thân mình, nhưng Bản thân Microsoft không tuân theo các khuyến nghị của anh ta. So sánh các số BEGIN TRANSACTION;
và Itzik của 01ztrong các ví dụ trước.
Trong đoạn code tôi duy trì, tôi đã thấy ngay cả những BEGIN
từ khóa chấm dứt bởi dấu chấm phẩy:
IF @HasWidget = 0x1
BEGIN;
SELECT WidgetID
FROM tbWidgets;
END;
Tôi tin rằng một phân tích cú pháp của T-SQL có thể xem xét các dấu chấm phẩy sau từ khóa BEGIN
để chấm dứt một tuyên bố trống rỗng hơn chấm dứt chính từ khóa BEGIN
; Tôi không tin rằng bản thân số BEGIN
là một câu lệnh T-SQL hợp lệ.
phỏng đoán này được hỗ trợ bởi thực tế là SQL Server 2008 phân tích thành công và thực hiện các truy vấn sau đây:
SELECT 0;;
Thật khó hiểu vì không có đặc điểm kỹ thuật phổ biến rộng rãi của ngôn ngữ T-SQL, như Java Language Specification cho Java, vì vậy không nơi nào có một định nghĩa chính thức của một câu lệnh T-SQL.
Tôi có sai không? Liệu một đặc điểm kỹ thuật như vậy tồn tại cho T-SQL, và nó có sẵn công khai không?
Nếu không, tôi có nên tin những gì Itzik nói không?
Tôi vừa xem qua câu hỏi này đang tìm cách làm rõ về một trong những điểm chính xác của bạn - cho dù dấu chấm phẩy nên chấm dứt BEGIN và BEGIN TRAN - nhưng có vẻ như vẫn chưa có thẩm quyền rõ ràng về vấn đề này! –
@AlastairAitchison Nếu bạn vẫn quan tâm, tôi đã yêu cầu Itzik giải thích lý do tại sao anh ấy nghĩ BEGIN TRAN không nên bị chấm dứt bởi dấu chấm phẩy trong một [bình luận về bài viết của anh ấy] (http://www.sqlmag.com/content2/topic/ semicolon-140706/catpath/tsql/seriespath/bối rối-by-t-sql-blog-15 # commentsAnchor). –
Bạn cũng nên đặt câu hỏi rằng 'IF' xuất hiện trong danh sách. Chỉ vì không có dấu chấm phẩy nào xuất hiện ở giữa câu lệnh 'IF' không có nghĩa là nó bị bỏ qua. Ví dụ: dấu chấm phẩy trong 'IF 1 = 1 SELECT 1;' vẫn là một phần của câu lệnh 'IF'… – binki