今天我遇到了一個有趣的問題。我正在修改一個存儲過程,並在最後輸入select語句。它只是暫時的,只是爲了處理數據。後來我很驚訝地發現,聲明得到保存並在SP運行時執行。存儲過程結束後的語句
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
這是有道理的,一切都被保存,不只是裏面是什麼BEGIN/END,否則意見和SET ANSI_NULLS
等就會消失。我有點困惑,從哪裏開始,所以我有幾個問題:
SET ANSI_NULLS
被保存爲SP的一部分。我已經確認每個SP都有自己的價值。 SQL Server如何知道將它保存爲SP的一部分,因爲它之前未被引用?它是否會對當前環境狀態進行全面掃描,然後當ALTER PROCEDURE
運行時會保存狀態(可能只有非默認值)?- 顯然BEGIN/END是可選的,沒有內在的意義。他們爲什麼甚至包括在內呢?他們給出了一個不存在的範圍的錯覺。在我看來,沒有BEGIN/END和GO在最後會是最有意義的。
BEGIN/END用於作用域,如在IF/WHILE /等中包含多個語句。坦率地說,與PLSQL相比,TSQL非常殘酷 - 它在結構/組織方面比BEGIN/END更加結構化,並且使用分號來終止行。就像TSQL在WITH/CTE之前需要一個分號一樣,如果你在它之前聲明變量......:/任何具有C語言經驗的人都可以被賦予PLSQL並能夠讀取它。不能說,對於TSQL ... – 2010-11-15 20:40:56
@OMG - 那麼在這種情況下它給出了什麼「範圍」?我能想象的唯一的事情是,如果你在BEGIN/END中聲明瞭一個變量,那麼它在外面是不可用的。爲什麼你會把SQL語句放在外面;你爲什麼不把所有的東西都放在外面,而不是BEGIN/END? – 2010-11-15 20:45:09
這個例子是有效的,我沒有說它是智能的;) – 2010-11-15 20:47:42