T-SQL: Преобразуване на NTEXT във VARCHAR в INT/BIGINT

Имам таблица с поле от тип NTEXT, което съхранява много типове стойности, включително размер на файла сред тях. Опитвам се да изпълня заявка за списък със записи и да събера размерите на файловете, но срещам този объркващ проблем.

Тъй като NTEXT не може да се преобразува директно/неявно в INT или BIGINT, първо го преобразувам в VARCHAR след това Опитвам се да го преобразувам в INT или BIGINT. Всичко върви добре, докато не опитам да конвертирам стойността VARCHAR в INT или BIGINT.

Ето моите запитвания и резултати:

Първо опитвам следното, което не показва проблеми и изходът е 61069 (стойността все още е тип ntext).

SELECT FileSize
FROM dbo.myTable
WHERE ID = 111

Сега го конвертирам/прехвърлям като varchar и отново няма проблем. Резултатът е 61069 (сега тип varchar).

SELECT CONVERT(VARCHAR, FileSize)
FROM dbo.myTable
WHERE ID = 111

Накрая се опитвам да конвертирам стойността VARCHAR в BIGINT, за да мога да направя SUM() и други изчисления, но този път получавам съобщение „Грешка при преобразуване на тип данни varchar в bigint.“.

SELECT CONVERT(BIGINT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

И ако вместо това се опитам да го преобразувам в INT, получавам "Неуспешно преобразуване при преобразуване на стойността на varchar '7/1/2008 3:39:30 AM' към тип данни int"

SELECT CONVERT(INT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

Абсолютно съм изгубен, някакви идеи какво може да причинява това?


person sergeidave    schedule 11.02.2013    source източник
comment
@GSerg не е фен на дубликата. Той използва много по-обща проверка срещу ISNUMERIC, която потенциално ще съвпада с повече редове и също така потенциално ще идентифицира стойности, които преминават проверката ISNUMERIC, но не могат да бъдат преобразувани в INT. Опитайте SELECT ISNUMERIC('5e6'); - сега опитайте да конвертирате този низ в INT. С други думи, ако този потребител използва този отговор, той пак може да получи съобщението за грешка. Това може да работи добре за FLOAT, но може да има случаи, които да се провалят и там. Бих внимавал да разчитам на ISNUMERIC за много.   -  person Aaron Bertrand    schedule 11.02.2013


Отговори (1)


Не можете да контролирате реда, в който се прилагат клаузата where и преобразуванията. В някои случаи SQL Server ще се опита да извърши преобразуването на редове, които не биха преминали филтъра - всичко зависи от плана. Опитайте това вместо това:

SELECT CASE WHEN ID = 111 THEN 
  CONVERT(INT, CONVERT(VARCHAR(12), FileSize))
  -- don't be lazy, size ------^^ is important
  END
FROM dbo.myTable
WHERE ID = 111;

Също така обмислете използването на колона с цели числа за съхраняване на цели числа. Тогава няма да се окажете с глупави глупости в колоната FileSize като '7/1/2008 3:39:30 AM'.

person Aaron Bertrand    schedule 11.02.2013
comment
Страхотни неща! Това оправи проблема ми! Благодаря ти, Арън!! - person sergeidave; 11.02.2013