在SSIS的Execute SQL Task組件中執行存儲過程,想要返回單行的結果,總是無法返回查詢的結果,返回的錯誤是無法把DBNull轉換為String類型:
The type of the value (DBNull) being assigned to variable "User::MailBody" differs from the current variable type (String). Variables may not change type during execution. Variable types are strict, except for variables of type Object
對於這個錯誤,暫不做深入的調查。存儲過程返回執行的結果,可以是通過返回值、基礎表來實現,當然也可以通過output參數來實現。
在創建存儲過程時,必須通過output關鍵字顯式聲明輸出型參數。對於輸出型參數,既可以接收值,也既可以不接收值,但是必須被賦值為變量,用於向外輸出結果。沒有用output關鍵字聲明的參數是輸入型參數,對於輸入型參數,只接收值,不向外輸出結果。
第一步:在存儲過程中定義output參數 @para,聲明輸出型參數的格式如下所示:
@para data_type output
舉個例子,創建一個存儲過程,定義參數@p2為輸出型參數,默認情況下,@p1是輸入型參數:
create proc sp_name @p1 int, @p2 int output
第二步:在存儲過程中對output參數賦值,注意,在存儲過程返回前,必須對output參數賦值,否則存儲過程會拋出異常
set @p2=value
第三步:調用存儲過程,獲得output參數的值
聲明一個變量@var,通過變量來獲得output參數的值,注意:在調用存儲過程時,必須通過output關鍵字顯式聲明輸出參數。
declare @var data_type exec sp_name @p1=1, @p2 = @var output
對於output參數,必須賦值為變量,變量可以初始化,也可以不初始化。
1,當變量被初始化時
如果變量已經初始化,那么輸出型參數接收了變量的值,和普通的輸入型參數的用法相同,可以在存儲過程中直接引用output參數的值。如下所示,可以在存儲過程sp_name中引用@p2的值:
declare @var data_type set @var=2 exec sp_name @p1=1, @p2 = @var output
2,當變量未初始化時
如果變量未被初始化,那么在存儲過程中,不可以直接引用output參數的值,只有輸出參數@p2被賦值之后,才可以引用。
declare @var data_type exec sp_name @p1=1, @p2 = @var output
參考文檔: