2011-08-18 13 views
2

我對SQL相當陌生,試圖編寫一個程序來檢查傳入的值並設置本地日期時間變量,然後返回該變量。SQL從過程返回日期時間導致隱式轉換錯誤

USE [MyDB] 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE [Common].[Update_Date] 
@Status_ID int 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @Date_Value DATETIME 

IF @Status_ID = 2 
    SET @Date_Value = GETDATE() 
ELSE 
    SET @Date_Value = NULL 

RETURN @Date_Value 
END 
GO 

當我嘗試執行該腳本,我得到以下錯誤:

消息257,級別16,狀態3,過程UPDATE_DATE 19行 從數據datetime類型爲int隱式轉換是不允許的。使用CONVERT函數來運行此查詢。

它試圖用我的@Status_ID參數做些什麼嗎?

回答

7

存儲過程使用OUTPUT參數返回值:

CREATE PROCEDURE [Common].[Update_Date] 
@Status_ID int, 
@Date_Value DATETIME OUTPUT 
AS 
BEGIN 
SET NOCOUNT ON; 

IF @Status_ID = 2 
    SET @Date_Value = GETDATE() 
ELSE 
    SET @Date_Value = NULL 
END 
GO 

從ADO.Net中調用時,您使用ParameterDirection.Output。從T-SQL你用OUTPUT子句調用:

declare @date DATETIME; 
exec [Common].[Update_Date] 2, @date OUTPUT; 
SELECT @date; 

一般來說,最好不要過程的輸出與回報,並用結果集(所以這將是對大多數其他的推薦票,你得使用混合SELECT)。使用OUTPUT使得程序可以從其他T-SQL代碼重用,使用結果集(SELECT)使得使用起來更加困難,因爲T-SQL在捕獲調用過程的結果集時遇到問題(您必須使用INSERT ... SELECT並處理all the problems that has)。

3

RETURN存儲過程中的值只能是整數。因此您選擇收到錯誤轉換@Date_Valueint

它看起來像你需要一個功能,而不是一個存儲過程

CREATE FUNCTION (Transact-SQL)

或者,你可以改變RETURNSELECT,但我會建議使用FUNCTION用於此類請求。

+0

什麼是決定因素選擇使這個功能在程序上? – ShelbyZ

+0

通常我會將存儲過程看作是將更改存儲在數據庫中的數據的操作,或者返回整個結果集以及可選的OUTPUT參數值。而函數不影響任何數據,只是基於傳遞的參數和可選的數據讀取返回一個值 – Curt

0

您不必使用「返回」來返回值,您可以使用「select」返回值。只需在SP末尾更改RETURN關鍵字並使用SELECT,我就可以工作。

0

Return關鍵字必須用於返回一個整數。嘗試將其更改爲Select @Date_Value

2

存儲過程的返回值必須是整數。 RETURN @Date_Value行會拋出錯誤。

0

你有幾個問題。試試這個:

CREATE PROCEDURE [Common].[Update_Date](
    @Status_ID INT 
) AS 

SET NOCOUNT ON 
BEGIN 

    --will @Date_Value have an initial value of NULL???? 
    DECLARE @Date_Value DATETIME  

    SET @Date_Value = NULL 

    IF @Status_ID = 2 BEGIN 
     SET @Date_Value = GETDATE() 
    END 

    SELECT @Date_Value 

END