我想創建一個存儲過程(在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
值,那麼我可以安全地假定調用者沒有明確定義這些參數的值。這是實現我的目標的唯一方法嗎?
是的,您需要使用非NULL值來表示不同的狀態。因此,要麼設置除NULL以外的默認值,要麼傳入NULL以外的值。選擇是否需要NULL或其他值來指示沒有值傳遞。 – nekno