Приведение даты и времени к varchar в скалярной функции SQL Server 2005 - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь выполнить следующую инструкцию. Скалярная функция ожидает varchar для даты, а исходный столбец в customertable - это дата и время. Я сделал свое исследование и осмотрелся; различные решения, которые я пробовал, не сработали.

Когда я запускаю это:

select 
   ID, DATE_COL,
   dbo.CustRandValuationOnDate (ID, LEFT(CONVERT(VARCHAR, DATE_COL, 120), 10)) 
from customertable

Я получаю эту ошибку:

Преобразование не удалось при преобразовании символьной строки в данные smalldatetime тип.

ОБНОВЛЕНИЕ: код функции

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER FUNCTION [dbo].[CustRandValuationOnDate](@DATE VARCHAR(11), @CIFNUMBER VARCHAR(12)) RETURNS FLOAT
 AS BEGIN
 RETURN ISNULL((SELECT SUM(DBO.RandValOfAccOnDate(@DATE, A.ACCOUNTID))
         FROM   ACCOUNTTBL A, BALANCETBL B
         WHERE  A.CIFNUMBER=@CIFNUMBER
         AND    B.ACCOUNTID=A.ACCOUNTID
         AND    B.VALUATIONDATE=@DATE), 0.00);
 END

ОБНОВЛЕНИЕ: некоторые значения в DATE_COL равны нулю. я только что это подтвердил.

Ответы [ 6 ]

1 голос
/ 24 июня 2011

OP говорит, что DATE - это дата и время:

LEFT(CONVERT(VARCHAR, GETDATE(), 120), 10)

действует и работает, как:

LEFT(CONVERT(VARCHAR, NULL, 120), 10)

В результате ошибка должна быть в вашей функции dbo.CustRandValuationOnDate(). Без этого кода нет способа решить эту проблему. Возможно, необходимо написать dbo.CustRandValuationOnDate() для обработки значений NULL.

РЕДАКТИРОВАТЬ после отправки функционального кода:

RETURN ISNULL((SELECT SUM(DBO.RandValOfAccOnDate(@DATE, A.ACCOUNTID))
                                                ^^ID?   ^^date??

параметры в неправильном порядке?

вы определяете параметры функции как: @DATE VARCHAR(11), @CIFNUMBER VARCHAR(12), но вызываете ее с помощью ID, LEFT(CONVERT(VARCHAR, DATE_COL, 120), 10), так что вы действительно пытаетесь сделать?

0 голосов
/ 24 июня 2011

Вы передаете свои параметры в неправильном порядке, чтобы функционировать ..

0 голосов
/ 24 июня 2011

Вы должны попробовать

выбрать ID, DATE_COL, dbo.CustRandValuationOnDate (ID, LEFT (CONVERT (VARCHAR, DATE_COL, 120), 10)) из таблицы покупателя, где ISDATE (DATE_COL) = 1

0 голосов
/ 24 июня 2011

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

После, сделайте приведение к varchar и используйте функцию ВЛЕВО.

0 голосов
/ 24 июня 2011

Похоже, у вас есть недопустимая строка даты в столбце DATE, каково значение DATE при возникновении этой ошибки?

0 голосов
/ 24 июня 2011

Вместо преобразования в дату вы можете использовать Cast(YourVariable As Date) для преобразования в DateFields.

...