Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Хочу получить ХТМЛ-ку как в коменте, нифига не получается :((

with cte as
(
select 'Ivanov' as surname, 'Ivan' as name
union all
select 'Petrov', 'Petr'
union all 
select 'Sidorov', 'Sample')

select '<td><font size="1"><a href="www.google.com">' + t.surname  + '</a></font></td>' as  'data()'
  from cte t for XML path('tr'), type

/*
<tr bgcolor="#eeeeee">
 <td><font size="1"><a href="www.google.com">Ivanov</a></font></td>
 <td><font size="1">Ivan</font></td>
</tr>
<tr bgcolor="#eeeeee">
 <td><font size="1"><a href="www.google.com">Petrov</a></font></td>
 <td><font size="1">Petr</font></td>
</tr>
<tr bgcolor="#eeeeee">
 <td><font size="1"><a href="www.google.com">Sidorov</a></font></td>
 <td><font size="1">Sample</font></td>
</tr>
*/

Хотелось бы пример.

Задолбало конечно использовать шаблонный код, есть ли источник где можно подбробнее ознакомится с этим на примерах?

Заранее спасибо :)
11 дек 09, 14:47    [8053888]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

если именно вот таким способом хочется собирать, то так:
select cast('<td><font size="1"><a href="www.google.com">' + t.surname  + '</a></font></td>' as xml) as  'node()'
   from cte t for XML path('tr'), type

Posted via ActualForum NNTP Server 1.4

11 дек 09, 14:51    [8053942]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
daw,

спасибо,

А <tr bgcolor="#eeeeee"> что делать?

Есть другой способ пооптимальнее (я имею ввиду через for XML, а не конкатенацию строк).
11 дек 09, 14:58    [8054046]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

но только так на всякие пакости можно попасться. типа:

select 'Pet<rov', 'Petr'

Posted via ActualForum NNTP Server 1.4

11 дек 09, 14:59    [8054050]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А *<tr bgcolor="#eeeeee">* что делать?

select '#eeeeee' as [@bgcolor],
        cast('<td><font size="1"><a href="www.google.com">'
        + t.surname
        + '</a></font></td>' as xml) as  'node()'
   from cte t for XML path('tr'), type

> Есть другой способ пооптимальнее (я имею ввиду через for XML, а не
> конкатенацию строк).

на счет оптимальности не знаю, а вообще так:
select
   '#eeeeee' as [@bgcolor]
   , 1 as [td/font/@size]
   , 'www.google.com' as [td/font/a/@href]
   , t.surname as [td/font/a]
from cte t for xml path('tr')

Posted via ActualForum NNTP Server 1.4

11 дек 09, 15:02    [8054109]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
daw,

Не получается отсальные столцы добавлять как отдельный тэг ТД

select
   '#eeeeee' as [@bgcolor]
   , 1 as [td/font/@size]
   , 'www.google.com' as [td/font/a/@href]
   , t.surname as [td/font/a]
   , t.name as [td/font]
from cte t for xml path('tr')

Как указать на то что это отдельный тэг ячейки и шрифта?
11 дек 09, 15:10    [8054229]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
реально получается только создать отдельный столбец, если использовать другое имя

select
   '#eeeeee' as [@bgcolor]
   , 1 as [td/font/@size]
   , 'www.google.com' as [td/font/a/@href]
   , t.surname as [td/font/a]
   , t.name as [td1/font]
from cte t for xml path('tr')

Как объяснить в PATH что надо сделать то же самое только с тем же именем?
11 дек 09, 15:20    [8054365]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Не получается отсальные столцы добавлять как отдельный тэг ТД

дык. сначала unpivot сделать надо.

with cte as
(
select 'Ivanov' as surname, 'Ivan' as name
union all
select 'Petrov', 'Petr'
union all
select 'Sidorov', 'Sample')
, cte2 as
(
select cast(surname as varchar(max)) [1]
        , cast(name as varchar(max)) [2]
        , row_number() over (order by (select null)) as [id]  from cte
)
, unpvt as
(
select value, column_number, id
  from cte2
  unpivot (value for column_number in ([1], [2])) as upvt
)
select
   '#eeeeee' as [@bgcolor]
    , (select
         1 as [td/font/@size]
         , 'www.google.com' as [td/font/a/@href]
         , t2.value as [td/font/a]
       from unpvt t2
       where t2.id = t1.id
       order by column_number
       for xml path(''), type
      ) [node()]
from (select distinct id from unpvt) t1
for xml path('tr')

хотя, оно, может, конечно, проще строки поскладывать.

Posted via ActualForum NNTP Server 1.4

11 дек 09, 15:33    [8054540]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

перемудрил. так, вроде, попроще:
select
   '#eeeeee' as [@bgcolor]
   , (select * from
        (
        select
          1 as [td/font/@size]
          , 'www.google.com' as [td/font/a/@href]
          ,  surname as [td/font/a]
        union all
        select
          1 as [td/font/@size]
          , 'www.google.com' as [td/font/a/@href]
          , name  as [td/font/a]
        ) t
      for xml path(''), type
     )
from cte
for xml path('tr')

Posted via ActualForum NNTP Server 1.4

11 дек 09, 15:42    [8054635]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Ага, тут принцип понятен, просто бывали случаи, когда
Пивот/Анпивот работает дольше чем он же переписанный на "union all" и "множестыенный left join"

В принципе я его юзаю, но тут я оптимизирую как раз отправку мыла.

Тут такая замута сейчас, я аж содрогнулся.

Висит джоб, запускающий SSIS-пакет,
SSIS пакет выбирает в цикле всех получателей по одному
на каждой итерации цикла SSIS пакет вызывает WEB-service на ASP.NET написанный
ASP.NET начинает генерить HTML-тело письма обращаясь к базе не одним dataset-ом и
В <asp:Repeater/> соответственно формируются уже эти таблички.
Потом это посылается Web-Service-ом на Mail-server.

Вообщем моя задача просто собрать в одной процедуре всё тело.

(причём хочу что бы конкатенкция была а-ля

<html> + ( for xml..) + ... + (for xml) + .... + </html>

Т.е. по сути одним оператором. Уже не знаю распаралелится там формирование каждой таблички или нет, но я точно знаю что не хочу использовать select @s = @s + 'td' ... from table... .


Вот такая постановка пробелов решит возможную проблему замены символов?

select '#eeeeee' as [@bgcolor],
        cast('<td><font size="1"><a href="www.google.com">'
        + t.surname
        + '</a></font></td>' as xml) as  'node()'
   from cte t for XML path('tr'), type


Просто реально не хочу Пивот/АнПивот.
11 дек 09, 15:47    [8054692]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
daw

перемудрил. так, вроде, попроще:
select
   '#eeeeee' as [@bgcolor]
   , (select * from
        (
        select
          1 as [td/font/@size]
          , 'www.google.com' as [td/font/a/@href]
          ,  surname as [td/font/a]
        union all
        select
          1 as [td/font/@size]
          , 'www.google.com' as [td/font/a/@href]
          , name  as [td/font/a]
        ) t
      for xml path(''), type
     )
from cte
for xml path('tr')



Не, ну то будет удовно только для двух атрибутов, у меня же их тут гора целая. Я так анпивотил, когда надо было заставить на 2000 работать :)
11 дек 09, 15:50    [8054718]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

мда. чисто for xml-ем больно уж монструозно получается.
а всякие спецсимволы так обойти можно:
select '#eeeeee' as [@bgcolor],
         cast('<td><font size="1"><a href="www.google.com">'
         + (select t.surname [data()] for xml path(''))
         + '</a></font></td>' as xml) as  'node()'
    from cte t for XML path('tr'), type

Posted via ActualForum NNTP Server 1.4

11 дек 09, 15:54    [8054768]     Ответить | Цитировать Сообщить модератору
 Re: For XML -> HTML  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
daw,

Хрень с обходом спецсиволов особенно помогает в гиперлинках с параметрами, Спасибо!

Пример предложения я налабал, посмотрим что скажет заказчик.
11 дек 09, 19:30    [8056456]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить