Ошибка преобразования типа данных nvarchar в datetime? - PullRequest
0 голосов
/ 28 марта 2012

Я использую SQL Server 2005, и когда я вызываю свой сохраненный процесс, я получаю эту ошибку:

Ошибка преобразования типа данных 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 =@id
end

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value

GO

1 Ответ

2 голосов
/ 28 марта 2012

Вы должны использовать открытый диапазон дат вместо преобразования обеих сторон уравнения в региональную строку.

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

Теперь ваш звонок может быть просто:

EXEC dbo.myProc @id = 1;

Кроме того, вы не должны использовать 'single quotes' для псевдонимов столбцов - этот синтаксис устарел. Вместо этого используйте [square brackets].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...