Не удалось выполнить процедуру: ошибка: преобразование не выполнено при преобразовании даты и / или времени из строки символов - PullRequest
0 голосов
/ 18 августа 2010

Я написал простую процедуру:

CREATE PROCEDURE [dbo].[sp_GetPublishedDocs2] 
    @FromDate as Datetime
AS
BEGIN

DECLARE @strSQL VARCHAR(5000)

SET @strSQL='SELECT * From Task WHERE 1=1 '

IF @FromDate <>'1/1/1900'

SET @strSQL = @strSQL + ' AND Task.CreatedDate >= '+Cast(@FromDate as Datetime)

EXEC(@strSQL)

END

Он успешно работает, когда я передаю параметр «01.01.1900», однако, когда я передаю любую другую дату, он говорит: Преобразование не удалось при преобразованиидата и / или время из символьной строки.

Есть ли кто-нибудь, кто мог бы помочь мне ...

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Вы должны привести @FromDate в varchar, так как вы выполняете конкатат строки.

CREATE PROCEDURE [dbo].[sp_GetPublishedDocs2]
( 
    @FromDate as Datetime
)
AS 
BEGIN

    DECLARE @strSQL VARCHAR(5000)

    SET @strSQL = 'SELECT * From Task WHERE 1=1 '

    IF @FromDate <>'1/1/1900'
    BEGIN
        SET @strSQL = @strSQL + ' AND Task.CreatedDate >= ''' + Cast(@FromDate as varchar) + ''''
    END

    EXEC(@strSQL)

END

Старайтесь избегать SELECT * FROM. Быстрее определить все столбцы явно.

СОВЕТ: для тестирования вы можете использовать PRINT пользу EXEC, чтобы посмотреть, какой sql был произведен.

РЕДАКТИРОВАТЬ: Вы можете использовать VARCHAR(MAX) здесь ...

0 голосов
/ 18 августа 2010
  1. Не используйте префикс sp_ для хранимых процедур, потому что он используется для системных процедур
  2. Если вы этого еще не сделали, поищите на этом сайте или в Google «условия динамического поиска» в TSQL
  3. Если вы этого еще не сделали, поищите на этом сайте или в Google «динамический SQL»
  4. Формат ГГГГММДД для строковых литералов даты всегда интерпретируется правильно
  5. Не используйте SELECT *, если у вас нет веских причин
  6. Всегда включать схему в имена объектов
  7. '2' в конце имени вашей процедуры - это запах кода , указывающий на то, что вы, возможно, не обрабатываете версионность исходного кода и развертывание без ошибок

И последнее, но не менее важное: будьте проще, если можете:

CREATE PROCEDURE [dbo].[usp_GetPublishedDocs2] 
(  
    @FromDate as Datetime 
) 
AS  
BEGIN 
    if @FromDate = '19000101'
    begin
        select * from dbo.Task
    end
    else
    begin
        select * from dbo.Task where CreatedDate >= @FromDate
    end
END 

Небольшое исследование условий динамического поиска покажет вам другие возможные способы реализации этого, что будет полезно, если вам нужны более сложные условия поиска.

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