[英]How to pass null to SQL Server stored procedure param with NON-NULL default value
我在多租戶數據庫中有一個SQL Server存儲過程。 所有客戶端都使用它,但是由於我不會同時更新所有客戶端,因此我需要提供默認參數值,這樣,如果客戶端沒有傳入參數,它們就不會拋出錯誤。
看起來像這樣:
ALTER PROCEDURE [dbo].[sp_UpdateSearchValues]
@pAuthID NVARCHAR(255),
@pgKey INT,
@pSearch01 NVARCHAR(255) = 'BTR:NOSEARCHUPDATE',
@pSearch02 NVARCHAR(255) = 'BTR:NOSEARCHUPDATE',
..
@pSearch30 NVARCHAR(255) = 'BTR:NOSEARCHUPDATE'
我不能使用null
作為默認值,因為null
是要傳入的有效值(以清除搜索索引)。 但是,當我將參數分配給DBNull.Value
,似乎存儲過程認為未傳遞任何內容 ,然后該存儲過程在其邏輯中使用默認的'BTR:NOSEARCHUPDATE'並且不執行任何操作(而不是清除值)-如果我分配DBNull,則下面的!='BTR; NOSEARCHUPDATE'評估為false。
CASE WHEN @pSearch01 != 'BTR:NOSEARCHUPDATE' THEN @pSearch01 ELSE pSearch01 END,
如果“傳入了某些內容(DBNull或值)”,則此語句只是試圖獲取參數的值,否則返回對應的db字段中的現有值。
我使用以下代碼分配DBNull
:
UpdateCommand.Parameters[ "@pSearch19" ].Value = DBNull.Value;
因此,問題是,如何將“ null”傳遞給存儲過程,以使其將其用作值,而不是簡單地使用默認值“ BTR:NOSEARCHUPDATE”?
null
是要傳遞的有效值,並且不會被默認參數值覆蓋。 我無法在T-SQL或ADO.NET中復制此行為。
EG為
create or alter procedure [dbo].[sp_UpdateSearchValues]
@pAuthID nvarchar(255),
@pgKey int,
@pSearch01 nvarchar(255) = 'BTR:NOSEARCHUPDATE',
@pSearch02 nvarchar(255) = 'BTR:NOSEARCHUPDATE',
@pSearch30 nvarchar(255) = 'BTR:NOSEARCHUPDATE'
as
begin
select @pSearch01 search01
end
然后在.NET中
using (var con = new SqlConnection("server=.;database=tempdb;integrated security=true"))
{
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "sp_UpdateSearchValues";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
var pAuthID = cmd.Parameters.Add("@pAuthID", SqlDbType.NVarChar,255 );
var pgKey = cmd.Parameters.Add("@pgKey", SqlDbType.Int);
var pSearch01 = cmd.Parameters.Add("@pSearch01", SqlDbType.NVarChar, 255);
pAuthID.Value = "a";
pgKey.Value = 1;
pSearch01.Value = DBNull.Value;
var r = cmd.ExecuteScalar();
Console.WriteLine($"{r} {r.GetType().Name}");
Console.ReadKey();
}
輸出
DBNull
但這看起來像是空比較和三值邏輯的簡單情況。
考慮:
declare @pSearch01 nvarchar(200) = null
select CASE WHEN @pSearch01 != 'BTR:NOSEARCHUPDATE' then 1 else 0 end
那會返回什么? null != 'BTR:NOSEARCHUPDATE'
是真實的語句嗎? 不,這不對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.