2012-03-28 2 views
0

SQL Server 2005를 사용하고 있는데 저장 프로 시저를 호출 할 때이 오류가 발생합니다.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

[date] 열의 데이터 형식은 무엇입니까? nvarchar입니까? –

답변

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)는 매개 변수는 선택 확인하고 귀찮게하지 않습니다

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 

지금 전화 단지가 될 수 있습니다 :에 그 PARAM을 전달 또한

EXEC dbo.myProc @id = 1; 

, 당신은 012를 사용하지 말아야합니다 열 별칭에 대해-이 구문은 더 이상 사용되지 않습니다. 대신 [square brackets]을 사용하십시오.

관련 문제