2017-01-10 3 views
1

Я пишу хранимую процедуру, и мне нужно сравнить переменную SQL Server с столбцом. Проблема в том, что если моя переменная SQL является VARCHAR, которая не совпадает с типом столбца, она не будет соответствовать.Сравнение VARCHAR различной длины

Пример:
Скажем, у меня есть таблица types с колонкой name, который имеет тип VARCHAR(100). Выполнение кода ниже не даст мне никаких результатов:

DECLARE @type VARCHAR(20); 
SET @type = 'My Type Name'; 
select * from types where name = @type 

Однако выполнение этого запроса будет найти мою колонку:

DECLARE @type VARCHAR(100); 
SET @type = 'My Type Name'; 
select * from types where name = @type 

Теперь, я хотел бы быть в состоянии сделать это первым потому что, если я изменяю столбец, я не хочу, чтобы этот запрос начал сбой. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Edit:

Вот моя колонка схемы:

My Schema

Запрос:

DECLARE @event_type VARCHAR(20); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

Выход:

First output

Запрос:

DECLARE @event_type VARCHAR(100); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

Выход:

Second output

+0

Можете ли вы поделиться некоторыми выборочные данные, где найти это происходит? '' My Type Name '' в строке длиной 20 равно '' My Type Name'' в строке длиной 100.Если вы попытаетесь установить переменную длиной 20 в значение с большей длиной, она будет усечена, и вы можете получить неожиданные результаты. – HoneyBadger

+1

Когда ввод '' My Type Name ''более 20 символов, первый не будет выполнен. Он усекает ввод до 20 символов и проверяет его на' имя'. Он не будет вызывать никаких исключений или предупреждений –

+0

Обновлен вопрос с примерами. – snyderxc

ответ

1

Ниже будет вести себя, как вы описали:

CREATE TABLE #types 
(
    type VARCHAR(100) 
) 

INSERT INTO #types (type) VALUES ('My Type Name') 

-- returns 1 row 
select * from #types 

-- returns 0 rows 
DECLARE @type VARCHAR(10); 
SET @type = 'My Type Name'; 
select * from #types where type = @type 

-- returns 1 row 
DECLARE @long_type VARCHAR(100); 
SET @long_type= 'My Type Name'; 
select * from #types where type = @long_type 

drop table #types 

Дело в том, что DECLARE @type VARCHAR(10); SET @type = 'My Type Name'; будет на самом деле установить переменную 'My Type Na' (длина = 10).

Итак, если ваше значение больше, чем ваша переменная, переменная устанавливается на усеченное значение. Нет предупреждений, ошибок нет. Если вы затем попытаетесь приравнять его к исходному (более длинному) значению, вы обнаружите, что они не равны.

+0

Это была именно эта проблема. Я использовал строку длиной более 20 символов, и она усекалась. Большое спасибо! Я также очень хочу, чтобы SQL Server дал вам предупреждение, но хорошо. – snyderxc

0

вот что я хотел бы сделать select * from events.types где LTRIM (RTRIM (имя)) = @event_type

1

отредактированного пример:

DECLARE @event_type VARCHAR(20); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

вы настраиваете @event_type строки до 27 символов, поэтому он усекается до 20 символов, и поэтому нет совпадения.

То, что я бы, вероятно, чтобы убедиться, если длина столбца меняется все в порядке, это объявить @event_type как VARCHAR (макс)

Смежные вопросы