Как в SQL Server 2008 проверить, можно ли преобразовать параметр varchar в тип данных money? - PullRequest
3 голосов
/ 06 января 2011

У меня есть хранимая процедура, которую я использую для вставки данных из CSV.Сами данные представляют собой сочетание типов, некоторых тестов, некоторых дат и полей денег.Я должен гарантировать, что эти данные будут сохранены, даже если они неправильно отформатированы, поэтому я сохраняю их все в varchars.Позже, как только данные будут проверены и проверены, они будут перемещены в другую таблицу с правильными типами данных.

Когда я делаю вставку в первую таблицу, я хотел бы сделать проверку, которая устанавливает флаг (битовый столбец) в строке, если это требует внимания.Например, если в имени денежного числа есть буквы, мне нужно пометить эту строку и добавить имя столбца в дополнительное поле errormsg, которое у меня есть.Затем я могу использовать этот флаг, чтобы найти и выделить для пользователей в интерфейсе поля, которые они должны редактировать.

Параметры даты кажутся простыми, я могу просто использовать IF ISDATE(@mydate) = '0', чтобы проверить, можно ли преобразовать этот параметр из varchar в datetime.Но я не могу найти ISMONEY () или что-то, что отдаленно эквивалентно.

Кто-нибудь знает, как позвонить, чтобы проверить, можно ли законно конвертировать содержимое архива в деньги?

РЕДАКТИРОВАТЬ: Я еще не проверял, ночто вы думаете о функции, подобной этой ?:

CREATE FUNCTION CheckIsMoney 
(
   @chkCol varchar(512)
)
RETURNS bit
AS
BEGIN
 -- Declare the return variable here
 DECLARE @retVal bit

SET @chkCol = REPLACE(@chkCol, '$', '');
SET @chkCol = REPLACE(@chkCol, ',', '');

IF (ISNUMERIC(@chkCOl + 'e0') = '1')
    SET @retVal = '1'
ELSE
    SET @retVal = '0'

RETURN @retVal

END
GO

Обновление

Только что закончил тестировать приведенный выше код, и он работает!

1 Ответ

5 голосов
/ 06 января 2011

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

Не используйте ISNUMERIC из коробки, хотя это ненадежно. Используйте это:

ISNUMERIC(MyCOl + 'e0')

Обратите внимание: если у вас 6 знаков после запятой, оно будет потеряно при конвертации в деньги

Другой вопрос с дополнительной информацией почему: Как определить значение поля, которое не может быть преобразовано в (десятичное, с плавающей запятой, int) в SQL Server

Edit:

Можете сделать это в одну строку, если хотите

ISNUMERIC(REPLACE(REPLACE(@chkCOl, '$', ''), ',', '') + 'e0')
...