2014-02-12 40 views
0

我目前正在調查在存儲過程中的錯誤建立在MS SQL Server 2008的 當前存儲過程的簽名是這樣的:T-SQL - 位輸出參數默認值

CREATE PROCEDURE dbo.<Name> 
(
    ParameterOne int 
    , ParameterTwo bit output 
) 

在代碼的輸出正在評估參數值以確定對我而言至少可疑的代碼流。代碼看起來是這樣的:

IF (ParameterTwo = 0) 
BEGIN 
     PRINT ParameterTwo 
     -- Do stuffs 
END 

IF (ParameterTwo = 0) 
BEGIN 
     PRINT ParameterTwo 
     -- Do other stuffs 
END 

在調試(使用打印)我配置標誌的塊#1和塊#內要被顯示但它們都沒有時執行的代碼被示出。 但是,如果在執行塊#1之前將值分配給ParameterTwo(ParameterTwo = 0),則會按預期顯示標誌。

我的擔心顯然是關於位輸出參數的創建。當你創建一個由MS SQL Server(如果有的話)分配的缺省值的位參數(輸入/輸出)時?那是一個NULL值嗎?我的印象是0(虛假),但似乎並非如此。

順便說一句 - 我正在考慮避免輸出參數的用法與代碼進行比較。相反,我傾向於認爲在存儲過程結束之前使用內部變量並將其值賦給輸出參數會更清楚。

任何迴應/意見將不勝感激。

在此先感謝。

+1

默認值是'NULL',而不是'0'。您應該明確設置值。 –

回答

2

documentation在這一點上很清楚:

變量在批處理或過程與 DECLARE語句體中聲明,並通過使用SET或 SELECT語句被賦值。遊標變量可以用此語句 來聲明,並與其他遊標相關的語句一起使用。聲明之後,所有 變量都被初始化爲NULL,除非聲明的部分 提供了一個值。

這也適用於表中的列。它適用於位以及其他類型。

請注意,NULL值的所有比較均失敗(is null除外),因此它不等於01

+0

謝謝@戈登!這清除了我們的懷疑,並引導我通過成功修復我正在尋找的錯誤。非常感激! – G21

1

除非您指定默認值,否則SQL不會默認參數。如果您不指定默認值,則參數值爲NULL。

例如,所有報表的打印輸出下面是「@bitX爲空」:

create procedure sp_testbit 
(
    @bit1 bit, 
    @bit2 bit output 
) 
as begin 
    if @bit1 is null print 'sp_testbit @bit1 is null' 
    else print 'sp_testbit @bit1 = ' + cast (@bit1 as varchar) 

    if @bit2 is null print 'sp_testbit @bit2 is null' 
    else print 'sp_testbit @bit2 = ' + cast (@bit2 as varchar) 
end 
go 

declare @bit1 bit, @bit2 bit 
exec sp_testbit @bit1, @bit2 output 

if @bit1 is null print 'exec sp_testbit @bit1 is null' 
else print 'exec sp_testbit @bit1 = ' + cast (@bit1 as varchar) 

if @bit2 is null print 'exec sp_testbit @bit2 is null' 
else print 'exec sp_testbit @bit2 = ' + cast (@bit2 as varchar) 
go 

drop procedure sp_testbit 
go 

可以聲明一個參數,並在同一時間分配給它一個默認值。這使得可選傳遞的輸入參數:

create procedure sp_testbit 
(
    @bit1 bit = 0, 
    @bit2 bit = 0 output 
) 

如果你不希望的輸入參數是可選的,你可以明確地設置在存儲過程的代碼值:

create procedure sp_testbit 
(
    @bit1 bit, 
    @bit2 bit output 
) 
as begin 
    if @bit1 is null set @bit1 = 0 -- default the input bit 
    set @bit2 = 0     -- default the output bit 
+0

您在帖子末尾的陳述不正確。即使SQL 2000支持可選的存儲過程參數,您可以在該參數不包含的情況下設置該值。 http://technet.microsoft.com/zh-cn/library/aa214375(v=sql.80).aspx SQL 2008是第一個可以在同一行代碼中聲明和設置值的版本。 「聲明@InternalVariable位= 0」將在SQL2008上工作,但在早期版本上失敗。 –

+0

謝謝。我正在回顧DECLARE語法更改。我將編輯帖子。 –