В дополнение к ответу, уже данному и принятому, также возможно поместить маркер и затем расположить все с отступом от текущего курсора до маркера. Таким образом войдите ma
, где Вы хотите вершину своего блока с отступом, курсор вниз, насколько Вам нужно и затем тип >'a
(отмечают, что" a
" может быть заменен любое допустимое имя маркера). Это иногда легче, чем 5>>
или vjjj>
.
Хорошо. Наконец я создал представление, которое работает:
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 в самом запросе заставляет оптимизатор запросов не смотреть на исходную таблицу, как сказал Кристиан Хейтер, возможно, происходит с другими представлениями
В идеале, вы хотите попытаться избежать хранения данных в этой форме - было бы целесообразно разделить данные 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 не думаю, что это отличная идея с точки зрения производительности, но это решение
Чтобы ответить на ваш вопрос о сообщении об ошибке: когда вы ссылаетесь на имя представления в другом запросе (при условии, что это традиционное представление, а не материализованное представление), SQL Server эффективно выполняет замену макроса представления
Преимущество этого заключается в том, что оптимизатор запросов может выполнять гораздо лучшую работу, если видит весь запрос, а не оптимизирует представление по отдельности как «черный ящик».
Следствием этого является то, что в случае возникновения ошибки описания ошибок могут сбивать с толку, потому что механизм выполнения обращается к базовым таблицам для данных, а не к представлению.
Я не уверен, как обрабатываются материализованные представления, но я бы представьте, что они рассматриваются как таблицы, поскольку данные представления кэшируются в базе данных.
Сказав это,Я согласен с предыдущими ответами - вам следует переосмыслить дизайн своей таблицы и разделить текстовые и целочисленные значения данных в отдельные столбцы.
Попробуйте изменить свое представление на это:
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)
Вы пытались преобразовать поле bigint другой таблицы в varchar? На мой взгляд, имеет смысл выполнить более надежное преобразование ... Это не должно сильно повлиять на вашу производительность, если поле varchar проиндексировано.
Рассмотрите возможность создания избыточного поля bigint для хранения целочисленного значения af MyCol.
Затем вы можете проиндексировать новое поле для ускорения присоединиться.
Попробуйте выполнить выбор в два этапа.
сначала создайте представление, которое выбирает все столбцы, в которых мой столбец является числовым.
Затем выполните выбор в том представлении, где вы приводите varchar field.
Другая вещь, на которую вы могли бы обратить внимание, - это ваш дизайн таблиц, устраняющий необходимость в приведении.
EDIT
Попробуйте использовать следующее:
SELECT
ID,
CAST(MyCol AS bigint) as MyCol
FROM
(
SELECT TOP (100) PERCENT
ID,
MyCol
FROM
MyTable
WHERE
(isnumeric(MyCol) = 1)
) as tmp
Это должно работать, поскольку только внутренний выбор возвращают числовые значения, и поэтому внешний выбор может преобразовать все значения из первого выбора в числовые.