2011-08-12 28 views
4

我想創建一個存儲過程(在SQL Server 2008 R2中),該存儲過程將根據表的PK更新表中的記錄。如何確定是否將參數值傳遞給存儲過程

的存儲過程將具有,例如,四個參數:

@ID int, 
@Name nvarchar(50), 
@Email nvarchar(80), 
@Phone nvarchar(20) 

我怎樣才能確定是否存儲過程的調用者傳遞的參數與如果一個(或多個)一個NULL值調用者沒有通過任何一個(或更多)參數?

C#主叫例如:

來電指定NULL@Phone

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "EditPerson"; 
    cmd.Parameters.AddWithValue("@ID", id); 
    cmd.Parameters.AddWithValue("@Name", 'Frank'); 
    cmd.Parameters.AddWithValue("@Email", '[email protected]'); 
    cmd.Parameters.AddWithValue("@Phone", DBNull.Value); 
    DatabaseManager.instance.ExecuteScalarQuery(cmd); 
} 

來電忽略@Phone參數:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "EditPerson"; 
    cmd.Parameters.AddWithValue("@ID", id); 
    cmd.Parameters.AddWithValue("@Name", 'Frank'); 
    cmd.Parameters.AddWithValue("@Email", '[email protected]'); 
    DatabaseManager.instance.ExecuteScalarQuery(cmd); 
} 

什麼我想在這裏完成,如果調用者明確指定一個參數的NULL值,然後我將更新記錄與NULL值。但是,如果用戶明確忽略傳遞參數,則查詢將保留已爲特定記錄設置的字段/列的值(即查詢不會更新該特定列)。

我想,我可以指定可以安全地假定,主叫方將永遠不會使用默認值 - 這樣的事情:

@ID int, 
@Name nvarchar(50) = 'NameIsUndefined', 
@Email nvarchar(80) = 'EmailIsUndefined', 
@Phone nvarchar(20) = 'PhoneIsUndefined' 

然後,在存儲過程,我可以檢查未定義的值 - 如果參數變量仍然設置爲NameIsUndefined,EmailIsUndefined和/或PhoneIsUndefined值,那麼我可以安全地假定調用者沒有明確定義這些參數的值。這是實現我的目標的唯一方法嗎?

+1

是的,您需要使用非NULL值來表示不同的狀態。因此,要麼設置除NULL以外的默認值,要麼傳入NULL以外的值。選擇是否需要NULL或其他值來指示沒有值傳遞。 – nekno

回答

1

在SQL Server AFAIK中無法區分NULL和NULL。在您的C#代碼中,我會A)傳遞另一個值,如空字符串,以指示已傳遞一個空值,然後在SQL中處理該值以向數據庫寫入NULL(如果值已通過),或保留如果變量爲NULL,則爲前一個值,或者B)不通過DBNull.Value,而是傳遞從DB讀取的以前的值。

6

如果你這樣聲明你的參數(沒有默認值),那麼存儲過程將需要全部四個參數,如果它們中的任何一個不會傳遞給由提供者構成的EXEC聲明就會失敗。

你可以聲明一些參數可選這樣的:

@Phone nvarchar(20) = NULL

然而,就沒有辦法在存儲過程裏面說,如果它被省略或明確設置爲NULL

相關問題