2012-03-28 210 views
0

SQL Server 2005を使用していますが、ストアドプロシージャを呼び出すときにこのエラーが発生します。データ型nvarcharをdatetimeに変換中にエラーが発生しましたか?

データ型nvarcharをdatetimeに変換中にエラーが発生しました。 したがって、私は自分の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ですか? –

答えて

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)は、アップフロント変数を宣言した変数に現在の日付/時間を割り当て、および変数を渡します。(b)のパラメータをオプションにして、気にしないでください

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

でその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; 

また、あなたは012を使用しないでください列エイリアスの場合は- この構文は推奨されていません。代わりに[square brackets]を使用してください。

関連する問題