У меня есть хранимая процедура, с которой я пытаюсь работать, чтобы сделать ее более эффективной. К сожалению, в настоящее время он потенциально используется многими приложениями, поэтому, хотя мое оптимальное решение будет переписываться, я в настоящее время ограничен тем, что есть.Принудительное замыкание на оператор CASE
Первоначально есть два входных параметра, оба VARCHAR. Мне нужно провести сравнение между ними по разным типам данных на основе значения первого параметра. Тем не менее, я получаю ошибки преобразования, когда они не должны существовать. Пример:
PROCEDURE ProcedureName
@SearchType VARCHAR(24)
, @SearchID VARCHAR(100)
AS
BEGIN
SELECT
t1.*,
t2.*
FROM
TableOne t1
JOIN TableTwo t2
WHERE
(CASE
WHEN UPPER(@SearchType) = 'GUID' THEN CAST(t2.guid AS VARCHAR(100))
WHEN UPPER(@SearchType) = 'ID' THEN t2.id
WHEN UPPER(@SearchType) = 'ANOTHERID' THEN t1.id
END)
=
(CASE
WHEN UPPER(@SearchType) = 'GUID' THEN @SearchID
WHEN UPPER(@SearchType) = 'ID'
OR UPPER(@SearchType) ='ANOTHERID' THEN CAST(@SearchID AS INT)
END)
END
Цель здесь, если тип поиска GUID, он будет преобразовать столбец Guid в таблице и сделать сравнение с входной строки. Поскольку оба поля ID в базе данных являются столбцами типа int, я хотел бы преобразовать SearchID, который будет иметь базовый тип данных целого числа, когда ID или ANOTHERID переданы, в целочисленный тип, соответствующий типу родного столбца. Однако каждый раз, когда я пытаюсь запустить это с помощью GUID в @SearchType и директором в @SearchID, я получаю эту ошибку: Ошибка преобразования при преобразовании значения varchar '< @SearchID>' в тип данных int.
Не следует ли замыкать это дело так, чтобы с этим входом не происходило преобразование в int? Могу ли я заставить его закорачиваться?
Удалите все вычисления и преобразования из предложения 'where', объявите три переменные соответствующих типов, назначьте их перед оператором' select' и используйте готовые для сравнения vars в 'where'. И поставьте опцию (перекомпилировать) ', потому что сохраненный план не успокоит вас при следующих запусках. –
Я добавил следующее к процедуре: 'IF UPPER (@SearchType) = 'ID' ИЛИ UPPER (@SearchType) = 'ANOTHERID' BEGIN SET @IntSearchID = CAST (@SearchID AS INT) END' Я тогда сделайте сравнение в конце только с одной новой переменной, так как входная переменная уже является varchar, а две другие опции - int: WHEN UPPER (@SearchType) = 'ID' ИЛИ UPPER (@SearchType) = 'ANOTHERID 'THEN @IntSearchID Однако, я все еще получаю ошибку преобразования. – Smoothjedi