преобразовать нулевой varchar в десятичный - PullRequest
1 голос
/ 03 января 2011

У меня есть требование создать несколько структур xml (заимствовать C-фразу) в sql-server-2005. Для этого я изменяю все свои значения на varchar. Проблема возникает, когда я хочу использовать ИСПОЛЬЗОВАНИЕ этих значений, я должен преобразовать их в десятичное число.

Итак, мой xml-код выглядит так:

set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>'

таким образом, если VAL равен нулю, я возвращаю специальное десятичное число и могу проверить это десятичное число. Недостатком этого является то, что я не могу использовать coalesce на другом конце, когда я использую значение, я должен проверить, равно ли его преобразованное значение 0. как это:

case when cast(InvestmentReturn.fn_getSTRUCT(...args...).value('results[1]/VAL[1]', 'varchar(40)')as decimal(10,5)) = -.11111

Поскольку производительность сейчас неприемлема, я подумал, что одним из способов повышения производительности может быть использование coalesce вместо использования вложенного оператора case и проверка значения на равенство с помощью моего специального «нулевого» эквивалента.

Есть мысли?

также, я вижу, что выборочный набор ('null' как десятичное число (10,5)) дает мне:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

1 Ответ

1 голос
/ 03 января 2011

Проблемы с производительностью могут быть вызваны рядом факторов.

Первый - использование XML в sql 2005. Я не знаю размер используемых вами XML-данных, но когда я попробовал это 5несколько лет назад, если вы преодолели барьер определенного размера (я думаю, это было 32 КБ, возможно, 64 КБ), тогда производительность обработки упала с обрыва.1 дополнительный байт приведет к тому, что запрос перейдет от 500 мс до 60 секунд.На этом этапе нам пришлось отказаться от предоставления SQL-серверу возможности работать с самими данными XML.Это было НАМНОГО быстрее сделать эту обработку в C #.

Второй - это вызов функций внутри оператора select.Если эта функция должна работать с несколькими строками, производительность снижается.Одним примером, который я всегда использую, чтобы проиллюстрировать это, является GETDATE ().Если вы установите для переменной значение, возвращаемое GETDATE (), а затем используете эту переменную в запросе выбора, она будет выполняться на порядок быстрее, чем вызов GETDATE () в самом запросе.Небольшой пример кода, который вы предоставили, может быть убийственным только потому, что он вызывает функцию.

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

...