2012-03-28 141 views
0

我正在使用sql server 2005,當我打電話給我存儲的proc時出現此錯誤:將數據類型nvarchar轉換爲datetime時出錯?

將數據類型nvarchar轉換爲datetime時出錯。 那麼我怎麼能通過我的日期時間來運行我的存儲過程?

create procedure [dbo].[myProc] 
@id as int, 
@date as datetime 
as 
begin 
    select id , DATEPART(day, @date) 
    from myTable 
    where convert(varchar,[date],101) = convert(varchar,@date,101) 
    and id [email protected] 
end 

DECLARE @return_value int 

EXEC @return_value = [dbo].[myProc] 
     @id = 1, 
     @date = N'getdate()' 

SELECT 'Return Value' = @return_value 

GO 
+0

列[日期]的數據類型是什麼?是nvarchar? – 2012-03-28 03:44:31

回答

2

您應該使用一個開放式的日期範圍,而不是等式的兩邊轉換爲區域字符串。現在

ALTER PROCEDURE [dbo].[myProc] 
    @id INT, 
    @date DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT id, DATEPART(DAY, @date) 
    FROM dbo.myTable 
    WHERE id = @id 
    AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, @date)) 
    AND [date] < DATEADD(DAY, 1, DATEDIFF(DAY, 0, @date)); 
END 
GO 

,你不能只是通過getdate()到像一個存儲過程調用(語法是無效的),你當然不能將它作爲一個字符串傳遞。所以有幾個選項。

(a)中聲明變量前面,指定當前的日期/時間的變量,並通過可變地:

DECLARE @d DATETIME; 
SET @d = GETDATE(); 
EXEC [dbo].[myProc] @id = 1, @date = @d; 

(B)使參數可選的,並且然後不打擾順便指出,在PARAM:

ALTER PROCEDURE [dbo].[myProc] 
    @id INT, 
    @date DATETIME = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @date = DATEADD(DAY, 0, DATEDIFF(DAY, 0, 
    COALESCE(@date, GETDATE()))); 

    SELECT id, DATEPART(DAY, @date) 
    FROM dbo.myTable 
    WHERE id = @id 
    AND [date] >= @date 
    AND [date] < DATEADD(DAY, 1, @date); 
END 
GO 

現在,您的通話可能只是:

EXEC dbo.myProc @id = 1; 

而且,你不應該使用'single quotes'列別名 - 此語法已棄用。改爲使用[square brackets]

相關問題