Переменные SQL Server - PullRequest
       5

Переменные SQL Server

4 голосов
/ 25 февраля 2010

Почему эти запросы возвращают разные значения? Первый возвращает набор результатов, как и ожидалось, а второй (который, насколько я могу судить, точно такой же) - нет. Есть мысли?

1

declare @c varchar(200)

set @c = 'columnName'

select top 1 * 
from myTable 
where @c is not null 
      and len(convert(varchar, @c)) > 0

2

SELECT top 1 * 
FROM myTable 
WHERE columnName IS NOT NULL 
      and len(convert(varchar,columnName)) > 0   

Ответы [ 5 ]

6 голосов
/ 25 февраля 2010

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

В запросе 1 вы проверяете, что @c не равно нулю (true, вы установили его) и что его длина больше 0 (true, это 10). Поскольку оба они верны, запрос 1 становится:

select top 1 * from myTable

(Возвращает первую строку в myTable на основе соответствующего индекса.)

РЕДАКТИРОВАТЬ: Обращаясь к комментариям по вопросу.

declare @myTable table
(
    columnName varchar(50)
)

insert into @myTable values ('8')

declare @c nvarchar(50)
set @c = 'columnName'

select top 1 * 
from @myTable 
where @c is not null 
      and len(convert(varchar, @c)) > 0

select top 1 * 
from @myTable 
where columnName is not null
      and len(convert(varchar,columnName)) > 0

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

2 голосов
/ 25 февраля 2010

В первом запросе вы проверяете значение 'columnName' по параметрам IS NOT NULL и length> 0. Во втором запросе вы проверяете значения в столбце columnName по этим параметрам .

Следует отметить, что запрос 1 будет всегда возвращать одну строку (при условии, что строка существует), где запрос 2 будет возвращать строку, только если содержимое columnName не равно нулю и длина> 0.

0 голосов
/ 25 февраля 2010

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

SELECT top 1 * FROM myTable WHERE 'columnName' IS NOT NULL and len(convert(varchar,'columnName')) > 0 
0 голосов
/ 25 февраля 2010

Первый запрос фактически оценивается как

select top 1 * from myTable where 'columnName' is not null and len(convert(varchar, 'columnName' )) > 0

Не так, как вы ожидали. Ожидалось.

0 голосов
/ 25 февраля 2010

Они не одинаковы - первый проверяет переменную, а второй проверяет столбец. «where @c is not null» означает, что переменная @c не является null - это не так, поскольку она содержит значение columnName. «where columnName is not null» означает, что поле columnName не содержит null. И то же самое для оценки длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...