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

Откуда: (((@)))
Сообщений: 8877
Подскажите, пожалуйста, КАК во внешний файл сбросить что бы получить .xml - файл вида:

<?xml version="1.0" encoding="utf-8"?>
<ROOT>
  <Nomenklatura>
    <Tovar Artic="art1" Ident="NewArt1" NAME="Новая позиция №1" VolCubMetr="0.8" DlinMetr="2" Visota="1" ShirinaM="0.4" Provereno="+">
       <TovarDetali>
          <TovarDetail vkluch="osnovanie1" kolich="2" DlinMetr="1" ShirinaM="0.4" provereno="+"/>
          <TovarDetail vkluch="stanina1" kolich="1" DlinMetr="2" ShirinaM="0.3" provereno="+"/>
          <TovarDetail vkluch="nabornik" kolich="1" DlinMetr="1" ShirinaM="0.3" provereno="-"/>
       </TovarDetali>
    </Tovar>
    <Tovar Artic="art2" Ident="NewArt2" NAME="Кран 12" VolCubMetr="7.5" DlinMetr="3" Visota="1" ShirinaM="2.5" Provereno="+"/>
  </Nomenklatura>
</ROOT>


Скрипт на таблицы тут:
+
declare @TovTbl  table ( Articul nvarchar(50) null
                        ,Identificator nvarchar(50) null
                        ,Name nvarchar(50) null
                        ,DlinMetr numeric(19,9) null
                        ,Visota numeric(19,9) null
                        ,ShirinaM numeric(19,9) null
                        ,Provereno char(1) null
                        ,Cena money null
                        ,Zakaz char(1) );
                        
declare @ComplTbl  table ( Articul nvarchar(50) null
                        ,vkluch nvarchar(50) null
                        ,Name nvarchar(50) null
                        ,DlinMetr numeric(19,9) null
                        ,Visota numeric(19,9) null
                        ,ShirinaM numeric(19,9) null
                        ,Provereno char(1) null
                        ,Cena money null
                        ,kolich numeric (5,2) null);

insert into @TovTbl (Articul,Identificator,Name,DlinMetr,Visota,ShirinaM,Provereno) 
  values ('art1', 'NewArt1', 'Новая позиция №1', 2, 1, 0.4, '+')
        ,('art2', 'NewArt2', 'Кран 12', 3, 1, 2.5, '+') ;
insert into @ComplTbl (Articul,vkluch,Name,DlinMetr,Visota,ShirinaM,Provereno,kolich)
  values ('art1', 'osnovanie1', 'Основание изделия', 1, null, 0.4, '+', 2)
        ,('art1', 'stanina1', 'Станина изделия', 2, null, 0.3, '+', 1 )
        ,('art1', 'nabornik', 'намордник', 1, null, 0.3, '-', 1 );

select Articul,Identificator,Name, VolCubMetr = cast((DlinMetr * Visota * ShirinaM) as numeric(19,9)), DlinMetr,Visota,ShirinaM,Provereno 
  from @TovTbl ;

select vkluch,kolich,DlinMetr,ShirinaM,Provereno
  from @ComplTbl ;



В xml - нивзубногой: описание скуля смотрел, темы листал, свои закладки на форуме перелопатил, всё равно туплю

Как начал с
select TovTbl.Articul,TovTbl.Identificator,TovTbl.Name, VolCubMetr = cast((TovTbl.DlinMetr * TovTbl.Visota * TovTbl.ShirinaM) as numeric(19,9)), TovTbl.DlinMetr,TovTbl.Visota,TovTbl.ShirinaM,TovTbl.Provereno 
      ,ComplTb.vkluch,ComplTb.kolich,ComplTb.DlinMetr,ComplTb.ShirinaM,ComplTb.Provereno
  from @TovTbl [TovTbl] 
    left outer join @ComplTbl [ComplTb] on [TovTbl].Articul = [ComplTb].Articul
  order by TovTbl.Articul for xml auto, ROOT

... так к нему опять и вернулся.
Проблемы всего лишь две:
1. С утилитой bcp какая-то фигня - в файл падает какая-то мегахерь - вроде понимаю что не так, но поправить не удаётся
2. Не могу понять как прикрутить "<?xml version="1.0" encoding="utf-8"?>" и засунуть всё в <ROOT> и в <Nomenklatura>.

MS-SQL Server 2008 (Stnd)


Заранее спасибо.
PS Мозг уже просто сломлен :(
PPS Трезвый я. Просто устал, наверное...
--------------------------
No ROM Basic...
9 ноя 16, 02:16    [19872560]     Ответить | Цитировать Сообщить модератору
 Re: select .... for XML в файл - подскажите, пожалуйста  [new]
tunknown
Member

Откуда:
Сообщений: 776
SIMPLicity_
Подскажите, пожалуйста, КАК во внешний файл сбросить что бы получить .xml - файл вида:

Проблемы всего лишь две:
1. С утилитой bcp какая-то фигня - в файл падает какая-то мегахерь - вроде понимаю что не так, но поправить не удаётся
2. Не могу понять как прикрутить "<?xml version="1.0" encoding="utf-8"?>" и засунуть всё в <ROOT> и в <Nomenklatura>.

MS-SQL Server 2008 (Stnd)

  • FAQ прочитан?
  • mssql 2008 не поддерживает utf-8, нелатинские символы будут выглядеть неверно
  • если делать через преобразование xml->n(?)varchar(max), то заголовок в xml можно добавить через текстовое сложение
  • 9 ноя 16, 11:34    [19873694]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    Sybex
    Member

    Откуда: Moscow
    Сообщений: 119
    xml можно получить так
    SELECT [@TovTbl].Articul '@Artic'
          ,[@TovTbl].Identificator '@Ident'
          ,[@TovTbl].Name '@NAME'
          ,cast(([@TovTbl].DlinMetr * [@TovTbl].Visota * [@TovTbl].ShirinaM) as numeric(19,9)) '@VolCubMetr'
          ,[@TovTbl].DlinMetr '@DlinMetr'
          ,[@TovTbl].Visota '@Visota'
          ,[@TovTbl].ShirinaM '@ShirinaM'
          ,[@TovTbl].Provereno '@Provereno'
          ,(SELECT [@ComplTbl].vkluch '@vkluch'
                  ,[@ComplTbl].kolich '@kolich'
                  ,[@ComplTbl].DlinMetr '@DlinMetr'
                  ,[@ComplTbl].ShirinaM '@ShirinaM'
                  ,[@ComplTbl].Provereno '@provereno'
              FROM @ComplTbl
             WHERE [@TovTbl].Articul = [@ComplTbl].Articul
             FOR XML PATH('TovarDetail'), TYPE) AS 'TovarDetali'
      FROM @TovTbl
       FOR XML PATH('Tovar'), ROOT('Nomenklatura')
    

    Далее просто обернуть в теги уже как фрагмент текста в тег ROOT и заголовок подставить.
    9 ноя 16, 11:36    [19873713]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9827
    SIMPLicity_
    Подскажите, пожалуйста, КАК во внешний файл сбросить что бы получить .xml - файл
    15899951
    9 ноя 16, 11:47    [19873785]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    Sybex
    Member

    Откуда: Moscow
    Сообщений: 119
    Кстати, если в тег ROOT xml нужно обернуть именно в запросе, без простой текстовой склейки, то можно его запихнуть в ещё один SELECT... FOR XML PATH('ROOT'). Как-то так:
    +
    SELECT (SELECT [@TovTbl].Articul '@Artic'
                  ,[@TovTbl].Identificator '@Ident'
                  ,[@TovTbl].Name '@NAME'
                  ,cast(([@TovTbl].DlinMetr * [@TovTbl].Visota * [@TovTbl].ShirinaM) as numeric(19,9)) '@VolCubMetr'
                  ,[@TovTbl].DlinMetr '@DlinMetr'
                  ,[@TovTbl].Visota '@Visota'
                  ,[@TovTbl].ShirinaM '@ShirinaM'
                  ,[@TovTbl].Provereno '@Provereno'
                  ,(SELECT [@ComplTbl].vkluch '@vkluch'
                          ,[@ComplTbl].kolich '@kolich'
                          ,[@ComplTbl].DlinMetr '@DlinMetr'
                          ,[@ComplTbl].ShirinaM '@ShirinaM'
                          ,[@ComplTbl].Provereno '@provereno'
                      FROM @ComplTbl
                     WHERE [@TovTbl].Articul = [@ComplTbl].Articul
                     FOR XML PATH('TovarDetail'), TYPE) AS 'TovarDetali'
              FROM @TovTbl
               FOR XML PATH('Tovar'), ROOT('Nomenklatura'), TYPE)
       FOR XML PATH('ROOT');
    
    9 ноя 16, 11:54    [19873833]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    SIMPLicity_
    Member

    Откуда: (((@)))
    Сообщений: 8877
    invm
    SIMPLicity_
    Подскажите, пожалуйста, КАК во внешний файл сбросить что бы получить .xml - файл
    15899951

    Спасибо!
    Пробую...
    9 ноя 16, 12:19    [19874077]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    SIMPLicity_
    Member

    Откуда: (((@)))
    Сообщений: 8877
    Sybex
    Кстати, если в тег ROOT xml нужно обернуть именно в запросе, без простой текстовой склейки, то можно его запихнуть в ещё один SELECT... FOR XML PATH('ROOT'). Как-то так:
    +
    SELECT (SELECT [@TovTbl].Articul '@Artic'
                  ,[@TovTbl].Identificator '@Ident'
                  ,[@TovTbl].Name '@NAME'
                  ,cast(([@TovTbl].DlinMetr * [@TovTbl].Visota * [@TovTbl].ShirinaM) as numeric(19,9)) '@VolCubMetr'
                  ,[@TovTbl].DlinMetr '@DlinMetr'
                  ,[@TovTbl].Visota '@Visota'
                  ,[@TovTbl].ShirinaM '@ShirinaM'
                  ,[@TovTbl].Provereno '@Provereno'
                  ,(SELECT [@ComplTbl].vkluch '@vkluch'
                          ,[@ComplTbl].kolich '@kolich'
                          ,[@ComplTbl].DlinMetr '@DlinMetr'
                          ,[@ComplTbl].ShirinaM '@ShirinaM'
                          ,[@ComplTbl].Provereno '@provereno'
                      FROM @ComplTbl
                     WHERE [@TovTbl].Articul = [@ComplTbl].Articul
                     FOR XML PATH('TovarDetail'), TYPE) AS 'TovarDetali'
              FROM @TovTbl
               FOR XML PATH('Tovar'), ROOT('Nomenklatura'), TYPE)
       FOR XML PATH('ROOT');
    

    Спасибо! Понял где тупил...
    PS Не в качестве самооправдания... Всё кажется таким простым и понятным..., когда УЖЕ ПОКАЗАЛИ, как оно должно быть.
    9 ноя 16, 12:22    [19874105]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    SIMPLicity_
    Member

    Откуда: (((@)))
    Сообщений: 8877
    tunknown
    SIMPLicity_
    Подскажите, пожалуйста, КАК во внешний файл сбросить что бы получить .xml - файл вида:

    Проблемы всего лишь две:
    1. С утилитой bcp какая-то фигня - в файл падает какая-то мегахерь - вроде понимаю что не так, но поправить не удаётся
    2. Не могу понять как прикрутить "<?xml version="1.0" encoding="utf-8"?>" и засунуть всё в <ROOT> и в <Nomenklatura>.

    MS-SQL Server 2008 (Stnd)

  • FAQ прочитан?
  • mssql 2008 не поддерживает utf-8, нелатинские символы будут выглядеть неверно
  • если делать через преобразование xml->n(?)varchar(max), то заголовок в xml можно добавить через текстовое сложение

  • Спасибо за ответ! Да, с чтения этой статьи и начинал (ну... не совсем с этого, конечно...)
    9 ноя 16, 12:25    [19874120]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    aleks2
    Guest
    Sybex
    Кстати, если в тег ROOT xml нужно обернуть именно в запросе, без простой текстовой склейки, то можно его запихнуть в ещё один SELECT... FOR XML PATH('ROOT'). Как-то так:
    +
    SELECT (SELECT [@TovTbl].Articul '@Artic'
                  ,[@TovTbl].Identificator '@Ident'
                  ,[@TovTbl].Name '@NAME'
                  ,cast(([@TovTbl].DlinMetr * [@TovTbl].Visota * [@TovTbl].ShirinaM) as numeric(19,9)) '@VolCubMetr'
                  ,[@TovTbl].DlinMetr '@DlinMetr'
                  ,[@TovTbl].Visota '@Visota'
                  ,[@TovTbl].ShirinaM '@ShirinaM'
                  ,[@TovTbl].Provereno '@Provereno'
                  ,(SELECT [@ComplTbl].vkluch '@vkluch'
                          ,[@ComplTbl].kolich '@kolich'
                          ,[@ComplTbl].DlinMetr '@DlinMetr'
                          ,[@ComplTbl].ShirinaM '@ShirinaM'
                          ,[@ComplTbl].Provereno '@provereno'
                      FROM @ComplTbl
                     WHERE [@TovTbl].Articul = [@ComplTbl].Articul
                     FOR XML PATH('TovarDetail'), TYPE) AS 'TovarDetali'
              FROM @TovTbl
               FOR XML PATH('Tovar'), ROOT('Nomenklatura'), TYPE)
       FOR XML PATH('ROOT');
    


    Сложноватенько. Немножко переименовав алиасы - получим "почти правильно".
    Далее тредстартеру следует поразмыслить на тему: а нафига козе баян?

    select Tovar.Articul,Tovar.Identificator,Tovar.Name, VolCubMetr = cast((Tovar.DlinMetr * Tovar.Visota * Tovar.ShirinaM) as numeric(19,9)), Tovar.DlinMetr,Tovar.Visota,Tovar.ShirinaM,Tovar.Provereno 
          ,TovarDetail.vkluch,TovarDetail.kolich,TovarDetail.DlinMetr,TovarDetail.ShirinaM,TovarDetail.Provereno
      from @TovTbl [Tovar] 
        left outer join @ComplTbl TovarDetail on Tovar.Articul = TovarDetail.Articul
      order by Tovar.Articul for xml auto, ROOT('Nomenklatura')
    
    9 ноя 16, 12:33    [19874181]     Ответить | Цитировать Сообщить модератору
     Re: select .... for XML в файл - подскажите, пожалуйста  [new]
    Руслан Дамирович
    Member

    Откуда: Резиновая нерезиновая
    Сообщений: 942
    А кому-то нравится и такое
    SELECT
      'Tovar/@id' = 1,
      'Tovar/@val' = 100,
      'Tovar/*' = ( SELECT '@id' = 1 FOR XML PATH ( 'Detal' ), ROOT( 'TovarDetal1' ), TYPE ),
      'Tovar/*' = ( SELECT '@id' = 2 FOR XML PATH ( 'Detal' ), ROOT( 'TovarDetal2' ), TYPE )
    FOR XML PATH( 'Nomenklatura' ), ROOT( 'ROOT' ), TYPE
    
    9 ноя 16, 15:18    [19875315]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить