Как сделать так, чтобы результаты сетки отображались ‹, а не?

Этот код:

SomeField + ' <' + cast(count(AnotherField) as varchar(6)) + '>'

Создает следующий результат в виде сетки:

Blah &lt;Blah2&gt;

Как я могу гарантировать, что объекты HTML отображаются как их эквиваленты символов? Я удивлен, что не смог найти ответ Google.

Спасибо.

Вот фрагмент большего размера:

select
   stuff((
      select
         ', ' + SomeField + ' <' + cast(count(AnotherField) as varchar(6)) + '>'
      from
         SomeTable as SomeAbbrev
      where
         SomeField = SomeOutsideField
      group by
         SomeField
      order by
         SomeField asc
      for xml path('')
   ),1,1,'') SomeFields
from
   blablabla
inner join
   blablabla
left join
   blablabla
left join
   blablabla
order by
   SomeDateField asc

person MattB    schedule 25.01.2011    source источник
comment
Результат должен быть закодирован и не экранирован.   -  person Griff    schedule 25.01.2011
comment
Это в представлении сетки SSMS для результатов? Я не могу воспроизвести проблему.   -  person Joe Stefanelli    schedule 25.01.2011
comment
Правильный. Это в операторе выбора, который находится внутри stuff (). Кажется, я не могу обойтись меньшим или большим, чем печать в форме объекта HTML.   -  person MattB    schedule 25.01.2011
comment
Вещи()? В вашем примере нет Stuff, поэтому я думаю, что нам не хватает некоторых релевантных частей запроса. Вы можете выложить остальное?   -  person Joe Stefanelli    schedule 25.01.2011
comment
Извините, теперь включен более крупный фрагмент.   -  person MattB    schedule 26.01.2011


Ответы (2)


Вы можете ознакомиться с используемой техникой здесь, или может быть проще обойти все вместе технику XML. и попробуйте что-то вроде примера ниже.

В этом примере все таблицы с их столбцами возвращаются в виде строки, разделенной запятыми.

create function dbo.ColumnString(@table_id int)
returns nvarchar(max)
as
begin
    declare @x nvarchar(max)

    select @x = coalesce(@x+',','') + c.name
        from sys.columns c
        where c.object_id = @table_id
        order by c.name

    return @x
end
go

select t.name, dbo.ColumnString(t.object_id)
    from sys.tables t
    where t.type = 'U'
    order by t.name

drop function dbo.ColumnString
person Joe Stefanelli    schedule 25.01.2011
comment
Работает отлично! Есть ли способ включить это в коррелированный подзапрос? Это было бы идеально, поскольку список основан на значении из другого внешнего запроса. - person MattB; 26.01.2011
comment
@MattB: вы можете инкапсулировать эту логику в UDF и вызывать UDF как часть внешнего запроса. - person Joe Stefanelli; 26.01.2011
comment
@MattB: я отредактировал свой пример, чтобы показать, как создавать / использовать UDF. - person Joe Stefanelli; 26.01.2011

Не идеальное решение, но я работаю ...

REPLACE(REPLACE(MyTable.MyColumn, '&lt;', '<'),'&gt;', '>') AS MyColumn

Использование UDF для замены списка html-кодов могло бы быть немного более «чистым» решением.

person Jason    schedule 25.01.2011
comment
SomeField + REPLACE ('', '', '‹') по-прежнему печатается в форме объекта. : - / Меньше или больше, чем мой собственный вставленный текст, не из БД. - person MattB; 25.01.2011
comment
У меня возникает эта проблема при использовании оператора FOR XML. Можете ли вы опубликовать весь запрос? - person Jason; 25.01.2011
comment
Запрос теперь включен в начальный пост. - person MattB; 26.01.2011
comment
Как я уже говорил, оператор FOR XML PATH в вашем запросе кодирует символы. Вы можете использовать решение, указанное в ответе выше, или попытаться избежать использования оператора FOR XML с помощью COALESCE. - person Jason; 26.01.2011
comment
Спасибо. Похоже, мне нужно найти обходной путь, который включает возможность вывода элементов списка с разделителями-запятыми, при этом сохраняя ‹и› без изменений. Мне нужно будет посмотреть, смогу ли я найти способ включить COALESCE в другой оператор выбора. - person MattB; 26.01.2011