Почему оператор выбора SQL не удается? - PullRequest
0 голосов
/ 27 июня 2009

В приведенном ниже сценарии окончательный выбор в представлении Комбинация завершается неудачей, есть идеи, почему?

Таблица подмножеств не имеет строки, которая соответствует строке в MasterCodes, которая не приведёт к целочисленному значению.

CREATE TABLE MasterCodes (
  ID INT
, Code VARCHAR(10) )
GO

CREATE TABLE Subset (
  ID INT )
GO


CREATE VIEW Combine AS
SELECT S.ID
, M.Code
, CAST(M.Code AS INT) IntCode
FROM Subset S
INNER JOIN MasterCodes M ON M.ID = S.ID
GO

INSERT MasterCodes (ID, Code) VALUES (1, '1')
INSERT MasterCodes (ID, Code) VALUES (2, '2')
INSERT MasterCodes (ID, Code) VALUES (3, 'three')
INSERT MasterCodes (ID, Code) VALUES (4, '4')
INSERT Subset (ID) VALUES (1)
INSERT Subset (ID) VALUES (2)
INSERT Subset (ID) VALUES (4)


SELECT * FROM Combine -- 3 rows returned

SELECT * FROM Combine WHERE Code = '2' -- 1 row returned

SELECT * FROM Combine WHERE Code = '3' -- 0 rows returned

SELECT * FROM Combine WHERE IntCode = 2 -- fails, error msg is

Msg 245, Level 16, State 1, Line 15
Conversion failed when converting the varchar value 'three' to data type int.

Среда Sql2k5 Standard (64-разрядная версия) ВКЛ Win2k3 Server R2

Ответы [ 4 ]

6 голосов
/ 27 июня 2009

Возможно, потому что в какой-то строке M.Code содержит буквенное слово «три», и представление пытается преобразовать не числовое слово в целое число (возможно, вы можете преобразовать «3» в целое, но не "щенок" или "три" и т. д.).

Редактировать: Добавлен комментарий, но стоит добавить его здесь. SQL Server попытается выполнить и присоединиться к как можно более эффективно, и он попытается применить условие where, очевидно, еще до присоединения.

Это имеет смысл, если учесть, что в настоящее время VIEW работают почти полностью как настоящая таблица. Это должно сделать что-то похожее на это; в противном случае он объединит все и вернет все значения ПЕРЕД фильтрацией.

ужасно дорого.

Что я не уверен, так это то, что план выполнения покажет этот уровень детализации.

2 голосов
/ 27 июня 2009

Вы вставляете строку «три» в MasterCodes.Code, и ваше представление пытается преобразовать это значение в целое число. Этот SQL должен выдавать ту же ошибку:

select cast("three" as int)

Решение? Замените «три» на «3» в вашем операторе вставки.

0 голосов
/ 27 июня 2009

Если ваш набор результатов точен: "SELECT * FROM Combine WHERE Code = '2' - возвращена 1 строка SELECT * FROM Combine WHERE Code = '3' - возвращено 0 строк SELECT * FROM Combine WHERE IntCode = 2 - сбой, ошибка msg isMsg 245, Уровень 16, Состояние 1, Строка 15Conversion не удалось преобразовать значение varchar 'three' в тип данных int. "

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

Надеюсь, это поможет!

0 голосов
/ 27 июня 2009

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

Используйте isnumeric () с оператором case для создания представления

case when isnumeric(field) then
    cast(field as int)
else
    null
end AS IntCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...