Tôi gặp phải một vấn đề thú vị hiện nay. Tôi đã thay đổi một thủ tục lưu trữ và đặt một tuyên bố chọn vào cuối cùng. Nó có nghĩa là tạm thời và chỉ để làm việc với dữ liệu. Tôi đã ngạc nhiên khi phát hiện ra rằng tuyên bố đã được lưu lại và đang thực hiện bất cứ khi nào SP chạy.Các câu lệnh sau END trong thủ tục lưu sẵn
SET ANSI_NULLS ON
GO
-- Comments usually go here and are saved as part of the SP
ALTER PROCEDURE [dbo].[MySP]
@param INT
AS
BEGIN
--Your normal SQL statements here
END
--You can also add SQL statements here
select * from LargeTable
--You have access to the params
select @param
Có nghĩa là mọi thứ được lưu, không chỉ những gì ở bên trong BEGIN/END, nếu không các nhận xét và SET ANSI_NULLS
, v.v. sẽ biến mất. Tôi hơi bối rối với những gì bắt đầu từ đâu, vì vậy tôi có một số câu hỏi:
SET ANSI_NULLS
được lưu như một phần của SP. Tôi đã xác nhận rằng mỗi SP có giá trị riêng. Làm thế nào để SQL Server biết để lưu này như là một phần của SP vì nó không được tham chiếu trước đây? Liệu nó có quét toàn bộ trạng thái môi trường hiện tại không, sau đó khiALTER PROCEDURE
chạy nó lưu trạng thái (chỉ có thể các giá trị không mặc định)?- Dường như BEGIN/END là tùy chọn và không có ý nghĩa nội tại. Tại sao họ thậm chí bao gồm sau đó? Họ đưa ra một cảm giác sai phạm vi không tồn tại. Dường như với tôi không có BEGIN/END và GO ở cuối sẽ có ý nghĩa nhất.
BEGIN/END được sử dụng cho phạm vi, như chứa nhiều câu lệnh trong một IF/WHILE/etc. Thành thật mà nói, TSQL là tàn nhẫn để làm việc với so với PLSQL - đó là cấu trúc/tổ chức hơn trong cách nó sử dụng BEGIN/END, và sử dụng dấu chấm phẩy để chấm dứt dòng. Giống như cách TSQL yêu cầu một dấu chấm phẩy trước một WITH/CTE nếu bạn khai báo biến trước khi nó ...:/Bất cứ ai có kinh nghiệm ngôn ngữ dựa trên C đều có thể được cung cấp PLSQL và có thể đọc nó. Không thể nói điều đó đối với TSQL ... –
@OMG - Vậy trường hợp này có phạm vi "phạm vi" nào? Điều duy nhất tôi có thể tưởng tượng là nếu bạn khai báo một biến bên trong BEGIN/END, nó không có sẵn bên ngoài. Tại sao bạn lại đặt câu lệnh SQL ở bên ngoài; tại sao bạn không đặt mọi thứ bên ngoài và không có BEGIN/END? –
Ví dụ là hợp lệ, tôi không nói nó là sapient;) –