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

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
Поступает файл, часть структуры привожу
          <Months>
            <Description>/</Description>
            <Month6>
              <Month>1/11</Month>
            </Month6>
            <Month7>
              <Month>2/11</Month>
            </Month7>
            <Month8>
              <Month>3/11</Month>
            </Month8>
            <Month9>
              <Month>4/11</Month>
            </Month9>
            <Month10>
              <Month>5/11</Month>
            </Month10>
            <Month11>
              <Month>6/11</Month>
            </Month11>
            <Month12>
              <Month>7/11</Month>
            </Month12>
          </Months>



Первый элемент (к примеру для приведённого случая) читаю
select @tmp = x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/Month6/Month)[1]','VARCHAR(10)')
	+char(9)+
	x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/Month6/Value)[1]','VARCHAR(20)')


В файле могут быть теги от Month1 до Month12, создал цикл где вызываю
set @str = 'Month'+ltrim(@c)
select @tmp = x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/'+@str+'/Month)[1]','VARCHAR(10)')
	+char(9)+
	x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/'+@str+'/Value)[1]','VARCHAR(20)')

получаю бяку The argument 1 of the xml data type method "value" must be a string literal

Читал ТУТ и ТУТ вроде есть примерчик втыкивания переменной - не пойму как в моём случае извратиться ......
30 янв 12, 13:56    [11996154]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
плохо читали

declare @Month varchar(10) = 'Month8'
select @x.value('(/Months/*[local-name()=sql:variable("@Month")]/Month)[1]', 'varchar(10)')


а зчем это надо ?
огласите задачу, может решение будет проще.
30 янв 12, 14:24    [11996457]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
megavolt
Member

Откуда: Москва
Сообщений: 52
Sergij Gromov может так лучше, чем в цикле?,
DECLARE @X XML = '
<Months>
  <Description>/</Description>
  <Month6><Month>1/11</Month></Month6>
  <Month7><Month>2/11</Month></Month7>
  <Month8><Month>3/11</Month></Month8>
  <Month9><Month>4/11</Month></Month9>
  <Month10><Month>5/11</Month></Month10>
  <Month11><Month>6/11</Month></Month11>
  <Month12><Month>7/11</Month></Month12>
</Months>'
SELECT D.N,
       @X.value('/Months[1]/*[local-name(.) = sql:column("D.N")][1]', 'varchar(100)')
  FROM (
           SELECT T.X.value('local-name(.)', 'varchar(100)') N
             FROM @X.nodes('/Months[1]/*') T(X)
       ) D
30 янв 12, 14:29    [11996526]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
megavolt,

пасибки заработало следующим макаром
set @Instalments = ''
set @c = 1

while @c <= 12 begin

	set @tmp = ''
	set @str = 'Month'+ltrim(@c) --+'/Month'
	set @str1 = 'Month'+ltrim(@c) --+'/Value'

	print @str+'!'
			
	select @tmp = x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/*[local-name()=sql:variable("@str")]/Month)[1]','VARCHAR(10)')
		+char(9)+
		x.value('(HistoricalCalendar/HCTotalNumberOfOverdueInstalments/*[local-name()=sql:variable("@str1")]/Value)[1]','VARCHAR(20)')
	FROM @x.nodes('//Contracts/Contract[position()=sql:variable("@cnt")]') mh(x)

	if @tmp is not null
		set @Instalments = @Instalments + char(13) + char(10) + @tmp

	set @c = @c + 1

end

print @Instalments
30 янв 12, 14:43    [11996691]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
megavolt
Member

Откуда: Москва
Сообщений: 52
упрощенный вариант:
DECLARE @X XML = '
<Months>
  <Description>/</Description>
  <Month6><Month>1/11</Month></Month6>
  <Month7><Month>2/11</Month></Month7>
  <Month8><Month>3/11</Month></Month8>
  <Month9><Month>4/11</Month></Month9>
  <Month10><Month>5/11</Month></Month10>
  <Month11><Month>6/11</Month></Month11>
  <Month12><Month>7/11</Month></Month12>
</Months>'
SELECT T.X.value('local-name(.)', 'varchar(100)'),
       T.X.value('data(.)', 'varchar(100)')
  FROM @X.nodes('/Months[1]/*') T(X)
30 янв 12, 15:22    [11997068]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
megavolt,

проверю - но вроде ненаглядно как для меня ;)
30 янв 12, 16:14    [11997558]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
Лююди, опять запара ...

    <Identifications>
      <Identification>
        <IdType ImportCode="2">Ідентифікаційний номер</IdType>
        <RegistrationDate />
        <DocumentNumber>9691908969</DocumentNumber>
      </Identification>
      <Identification>
        <IdType ImportCode="4">Громадянський паспорт</IdType>
        <RegistrationDate />
        <DocumentNumber>КА 929390</DocumentNumber>
        <IssuedBy>Яворівським РВ УМВС України у Львівській області</IssuedBy>
        <IssueDate>1999-09-99T00:00:00</IssueDate>
      </Identification>
    </Identifications>


Читаю
repxml.value('(//Identification/IdType)[1]', 'nvarchar(100)')
- оно возвращает первое вхождение IdType а надо то где ImportCode="4" .....
31 янв 12, 15:36    [12004848]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
Да, и DocumentNumber надо читать из нужной области а не из первой "где встретилось"
31 янв 12, 16:00    [12005140]     Ответить | Цитировать Сообщить модератору
 Re: xml - именование тега програмно  [new]
Sergij Gromov
Member

Откуда: 49°49'44.58"N, 23°59'40.42"E
Сообщений: 443
repxml.value('(//Identification/IdType[@ImportCode = "4"])[1]', 'nvarchar(100)')
repxml.value('(//Identification/IdType[@ImportCode = "4"]/../DocumentNumber)[1]', 'nvarchar(20)')
сам себе и отвечу :)
31 янв 12, 16:21    [12005332]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить