2012-03-28 140 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]

相关问题