2013-06-02 9 views
2

Пожалуйста, помогите мне с этим вызовом.Конкатенация строки SQL Server возвращает пустой

Этот код возвращает пустой результат, и я не могу понять причину.

enter image description here

select Vendor_Name + ' || ' + cast(cnt as varchar(12)) as Vendor_Count 
from (select top (1) Vendor_Name, count(Vendor_Name) as cnt 
     from dbo.Vendors nolock 
     group by Vendor_Name 
     having count(Vendor_Name)>1 
     order by 2 desc) x 

Но ... Внутренний запрос возвращает VENDOR_NAME пустой и CNT 63420

enter image description here

select top (1) 
    Vendor_Name, count(Vendor_Name) as cnt 
from 
    dbo.Vendors nolock 
group by 
    Vendor_Name 
having 
    count(Vendor_Name) > 1 
order by 
    2 desc 

Вот это результат внутреннего запроса без верхней (1). Как вы можете видеть, пустое/пустое/пустое имя Vendor_Name встречается наиболее часто.

enter image description here

проверить длину VENDOR_NAME, используя функцию LEN(), и она возвращается 12. Но когда я скопировать результат от внутреннего запроса выше на листе Excel, и использовать функцию Len() в Excel - excel показывает 0. Объявленная длина для Vendor_name в таблице SQL Server равна nvarchar(50).

Я пробовал isnull(Vendor_Name,'') и COALESCE(Vendor_Name,''), но это не имело значения.

Я повторно разместил запрос и получил непустой результат, интересно, что это работает, но мой первоначальный запрос не делает.

select ' || ' + cast(cnt as varchar(12)) + ' ' + Vendor_Name 
from (select top (1) Vendor_Name, count(Vendor_Name) as cnt 
     from dbo.Vendors nolock 
     group by Vendor_Name 
     having count(Vendor_Name)>1 
     order by 2 desc) x 

Но этот результат не то, что я хотел.

Я что-то пропустил?

Спасибо!

пс. Я попытался воспроизвести данные, чтобы опубликовать их здесь, но безуспешно.

+1

ли вы имеете в виду на самом деле пустой «», или пустой «» или нуль? – automatic

+1

Кроме того: 'это жирный кодировщик, который использует 'order by 2'. Вы, должно быть, не сделали много обслуживания по коду других людей. – HABO

+0

@automatic Не может быть 'null' из-за' having' –

ответ

6

Это настоящая загадка!

Я подозреваю, что имя Vendor_Name может начинаться с символа NUL ('\0'), указывающего на конец строки. Это сделало бы показаться, чтобы не иметь содержания и объяснить разницу в порядке конкатенации.

Чтобы проверить это, пожалуйста, попробуйте REPLACE(Vendor_Name, CHAR(0), ' ') в вашем внешнем запросе

+0

Вы прибили его Стив! Спасибо! –

+0

Спасибо @ToDo, отличный вопрос :-) –

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