Арифметическое переполнение, определяющее, какие столбцы и строки? - PullRequest
1 голос
/ 20 марта 2012

У меня есть огромное представление о 236 столбцах, содержащих не менее 500 000 строк. Если я сделаю простой SELECT * FROM VIEW, в какой-то момент я получу арифметическое переполнение, и SELECT прекратит работу.

Я точно знаю, почему - в некоторых строках и столбцах CAST(COL AS DECIMAL(x,y)) терпит неудачу, что вызвано числом, которое слишком велико, чтобы соответствовать ограничениям, накладываемым приведением. Мне нужно точно определить эту строку и столбец, и я ищу, чтобы найти автоматический способ найти данные, которые вызывают это.

Возможно ли это как-то автоматизировать? Поскольку метод грубой силы является слишком исчерпывающим, так как я должен пройти через соответствующие столбцы (около 80 столбцов приводятся к десятичному числу), а затем найти точную строку, для которой я еще не разработал метод , Я не могу «увидеть» строку, так как она не работает, поэтому никогда не отображается.

Представление на SQL Server 2008 R2.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Я нашел несколько ответов на SO, которые могут быть полезны.

Как выяснить, в каком столбце возникает ошибка арифметического переполнения при вставке? (имеется скрипт для определения столбца)

SELECT  'PRINT ''' 
        + sc.Name 
        + '''; SELECT MIN(CAST(' 
        + sc.Name 
        + ' AS INTEGER)) FROM Usertable'
FROM    sys.columns sc 
        INNER JOIN sys.types st ON st.system_type_id = sc.system_type_id
WHERE   OBJECT_NAME(Object_ID) = 'BaseTable'
        AND st.name = 'INT'

Как только вы знаете столбец, выдолжен быть в состоянии развернуть, чтобы найти строку.Существует также еще один вопрос о поиске строки:

Узнайте, какая строка вызвала ошибку

Или этот вопрос:

T-SQL Арифметическое переполнение: какой столбец?

0 голосов
/ 20 марта 2012

Да, к сожалению, не существует хорошего автоматического способа найти значение, которое является недопустимым для данного приведения.Вы в значительной степени застряли, делая «разделяй и властвуй» и записывая запросы, такие как тот, на который ссылается bluefeet, чтобы сузить его.

Техника использования DMV в этом запросе сэкономит вам некоторое время.

Кроме того, остерегайтесь таких утверждений, как

select cast(col as decimal(18,6)
where isnumeric(col)

Мало того, что isnumeric не только неожиданно обрабатывает определенные значения, но и SQL Server может свободно определять порядок применения операций, так что запрос может закончитьсяприменяя приведение перед фильтрацией строк.Это может произойти, даже если фильтр находится внутри подзапроса или CTE.

Наконец, помните, что вы можете использовать предложение top x percent в своем исследовании, чтобы помочь вам сузить строки, вызывающие проблемы.

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