Ошибка, преобразовывающая тип данных varchar

В дополнение к ответу, уже данному и принятому, также возможно поместить маркер и затем расположить все с отступом от текущего курсора до маркера. Таким образом войдите ma, где Вы хотите вершину своего блока с отступом, курсор вниз, насколько Вам нужно и затем тип >'a (отмечают, что" a" может быть заменен любое допустимое имя маркера). Это иногда легче, чем 5>> или vjjj>.

6
задан Ian R. O'Brien 22 December 2012 в 03:43
поделиться

8 ответов

Хорошо. Наконец я создал представление, которое работает:

SELECT TOP (100) PERCENT id, CAST(CASE WHEN IsNumeric(MyCol) = 1 THEN MyCol ELSE NULL END AS bigint) AS MyCol
FROM         dbo.MyTable
WHERE     (MyCol NOT LIKE '%[^0-9]%')

Благодаря AdaTheDev и CodeByMoonlight . Я использовал ваши два ответа, чтобы добраться до этого. (Спасибо, конечно, и другим респондентам)

Теперь, когда я соединяюсь с другими столбцами bigint или делаю что-то вроде «SELECT * FROM MyView, где mycol = 1», он возвращает правильный результат без ошибок. Я предполагаю, что CAST в самом запросе заставляет оптимизатор запросов не смотреть на исходную таблицу, как сказал Кристиан Хейтер, возможно, происходит с другими представлениями

2
ответ дан 17 December 2019 в 04:50
поделиться

В идеале, вы хотите попытаться избежать хранения данных в этой форме - было бы целесообразно разделить данные BIGINT в отдельный столбец для повышения производительности и простоты использования запрос.

Однако вы можете выполнить JOIN, как в этом примере. Обратите внимание: я не использую ISNUMERIC () , чтобы определить, ' Единственный способ заставить его работать при наличии предложения WHERE для определенного целочисленного значения без выполнения еще одного CAST () в предположительно столбце bigint в предложении where - это использовать пользовательскую функцию:

CREATE  FUNCTION [dbo].[fnBigIntRecordsOnly]()
RETURNS @Results TABLE (BigIntCol BIGINT)
AS
BEGIN
INSERT @Results
SELECT CAST(MyCol AS BIGINT)
FROM MyTable
WHERE MyCol NOT LIKE '%[^0-9]%'
RETURN
END

SELECT * FROM [dbo].[fnBigIntRecordsOnly]() WHERE BigIntCol = 1

I не думаю, что это отличная идея с точки зрения производительности, но это решение

1
ответ дан 17 December 2019 в 04:50
поделиться

Чтобы ответить на ваш вопрос о сообщении об ошибке: когда вы ссылаетесь на имя представления в другом запросе (при условии, что это традиционное представление, а не материализованное представление), SQL Server эффективно выполняет замену макроса представления

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

Следствием этого является то, что в случае возникновения ошибки описания ошибок могут сбивать с толку, потому что механизм выполнения обращается к базовым таблицам для данных, а не к представлению.

Я не уверен, как обрабатываются материализованные представления, но я бы представьте, что они рассматриваются как таблицы, поскольку данные представления кэшируются в базе данных.

Сказав это,Я согласен с предыдущими ответами - вам следует переосмыслить дизайн своей таблицы и разделить текстовые и целочисленные значения данных в отдельные столбцы.

1
ответ дан 17 December 2019 в 04:50
поделиться

Попробуйте изменить свое представление на это:

SELECT TOP 100 PERCENT ID, 
Cast(Case When IsNumeric(MyCol) = 1 Then MyCol Else null End AS bigint) AS MyCol
FROM MyTable
WHERE (IsNumeric(MyCol) = 1)
1
ответ дан 17 December 2019 в 04:50
поделиться

Вы пытались преобразовать поле bigint другой таблицы в varchar? На мой взгляд, имеет смысл выполнить более надежное преобразование ... Это не должно сильно повлиять на вашу производительность, если поле varchar проиндексировано.

0
ответ дан 17 December 2019 в 04:50
поделиться

Рассмотрите возможность создания избыточного поля bigint для хранения целочисленного значения af MyCol.

Затем вы можете проиндексировать новое поле для ускорения присоединиться.

0
ответ дан 17 December 2019 в 04:50
поделиться

Попробуйте выполнить выбор в два этапа.

сначала создайте представление, которое выбирает все столбцы, в которых мой столбец является числовым.

Затем выполните выбор в том представлении, где вы приводите varchar field.

Другая вещь, на которую вы могли бы обратить внимание, - это ваш дизайн таблиц, устраняющий необходимость в приведении.

EDIT

  • Некоторые числа больше, чем bigint?
  • Есть ли пробелы, ведущие , в конце или в числе?
  • Есть ли символы формата? Десятичные точки?
0
ответ дан 17 December 2019 в 04:50
поделиться

Попробуйте использовать следующее:

SELECT 
  ID, 
  CAST(MyCol AS bigint) as MyCol
FROM
(
  SELECT TOP (100) PERCENT 
      ID, 
      MyCol 
  FROM 
      MyTable 
  WHERE 
      (isnumeric(MyCol) = 1)
) as tmp

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

0
ответ дан 17 December 2019 в 04:50
поделиться