0

與Oracle類似,SQL Server支持存儲過程中的參數默認值。甲骨文語法:使用SYS或INFORMATION_SCHEMA表發現SQL Server過程默認參數

CREATE OR REPLACE PROCEDURE p_default (
    p_in_number IN number := 0, 
    p_out_number OUT number, 
    p_in_varchar IN varchar2 := '0', 
    p_out_varchar OUT varchar2, 
    p_in_date  IN date  := date '1981-07-10', 
    p_out_date OUT date 
) 

SQL Server語法:

CREATE PROCEDURE p_default (
    @p_in_number  INTEGER = 0, 
    @p_out_number  INTEGER OUT, 
    @p_in_varchar  VARCHAR(10) = '0', 
    @p_out_varchar  VARCHAR(10) OUT, 
    @p_in_date   DATE = '1981-07-10', 
    @p_out_date  DATE OUT 
) 

有了Oracle,我發現使用此查詢的默認值:

SELECT argument_name, defaulted FROM all_arguments WHERE object_id = :proc_id 

我怎樣才能發現這個從SQL Server sys選擇或INFORMATION_SCHEMA表? (!),我沒有看到INFORMATION_SCHEMA.PARAMETERS任何有用的列,sys.parameters.has_default_value似乎並沒有被正確設定

注意,我也問過類似的問題有關DB2:

Discover DB2 procedure default parameters using SYSCAT tables

回答

4

有沒有簡單方法來做到這一點。由於documentation for has_default_value指出:

SQL Server僅維護此目錄視圖中的CLR對象的默認值;因此,對於Transact-SQL對象,此列的值爲0。要查看Transact-SQL對象中參數的默認值,請查詢sys.sql_modules目錄視圖的definition列,或使用OBJECT_DEFINITION系統函數。

所以你不得不把整個存儲過程定義出來並自己解析它來確定值。


附註:我會警惕@p_in_date DATE = '1981-07-10'。我知道date數據類型比datetime更合理一些,但我不確定上述內容是否仍然不明確 - 當然,如果將其轉換爲datetime,則可能會在10月7日或10月7日結束,具體取決於語言設置。我會更喜歡'19810710'這將永遠被解釋爲7月10日。

+0

謝謝。我在問這個問題後不久也發現了這個信息......太糟糕了 – 2012-03-23 11:38:30

+0

關於'date'的默認值,這只是一個例子......但是謝謝你的提示! – 2012-03-23 11:47:38