簡體   English   中英

如何將NULL傳遞給具有NON-NULL默認值的SQL Server存儲過程參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM