2010-07-15 52 views
1

我有一個TSQL表值函數,它很複雜。我想確保其中一個參數不能爲空。然而,當我在參數聲明之後指定NOT NULL時,會出現SQL錯誤。如何防止表值函數參數的空值?

是否可以通過調用SQL來防止將表值函數的參數分配爲空?

回答

5

在我看來,最好在函數的開頭檢查NULL值並使用RAISERROR(不,這不是錯字)來引發異常。編輯:不幸的是,這並不能用於UDF的工作,所以你必須去與選項2

您也可以選擇指定的選項「返回NULL ON NULL INPUT」當你創建你的函數。如果指定了這個標誌,那麼如果它的任何輸入都是空的,函數將返回NULL ...有點矛盾,但它可能是你想要的。

從MSDN文檔CREATE FUNCTION(引用,因爲他們沒有自己的頁面上的錨的Bleh):

RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

Specifies the OnNULLCall attribute of a scalar-valued function. If not specified, CALLED ON NULL INPUT is implied by default. This means that the function body executes even if NULL is passed as an argument.

If RETURNS NULL ON NULL INPUT is specified in a CLR function, it indicates that SQL Server can return NULL when any of the arguments it receives is NULL, without actually invoking the body of the function. If the method of a CLR function specified in already has a custom attribute that indicates RETURNS NULL ON NULL INPUT, but the CREATE FUNCTION statement indicates CALLED ON NULL INPUT, the CREATE FUNCTION statement takes precedence. The OnNULLCall attribute cannot be specified for CLR table-valued functions.

希望它可以幫助一些,我不同意,這是不必要的混亂。

+0

謝謝,這是非常詳細的。 – Llyle 2010-07-15 02:02:18

+0

你很受歡迎。事實上,在你問及我對它做了一些研究之前,我並沒有意識到這些,所以謝謝你。 :) – Faisal 2010-07-15 02:03:15

+1

我打算建議同樣的事情(RAISERROR),並決定在我的本地SQL開發框中試用它。您不能在TVF(表值函數)中使用RAISERROR。你會得到這樣的錯誤:'在一個函數中無效使用副作用運算符'RAISERROR''。 – 2010-07-15 02:04:59