Generowanie XML'a

0

Witam, potrzebuję pomocy z wygenerowaniem xml'a z bazy danych w mssql, mam podany jak ma wyglądać ten plik:

<StatystykaWizyt od="data" do="data">
  <Pacjent imie="imie" nazwisko="nazwisko">
    <Wizyta specjalnosc="specjalnosc"> liczba </Wizyta>
	....
  </Pacjent>
  ....  
</StatystykaWizyt>

chodzi mi o to aby w węźle wizyta ta liczba była właśnie tak jak wyżej
mój kod:

declare @od date
declare @do date
set @od = '2016-11-05'
set @do = '2016-11-30'
--drop table #nowa2
create table #nowa2 (od date, do date)
insert into #nowa2 values(@od,@do)

select od, do,
	(select 
	P.Imie
	,P.Nazwisko
	,
		(																	
  		select
  		S.Nazwa as Specjalnosc, 
		Count (W.IdPacjenta) as liczba
  		from
  		((((Specjalizacje S join Kwalifikacje K on S.Id=K.IdSpecjalizacji)
		join Lekarze L on L.Id=K.IdLekarza) join Terminy T on T.IdLekarza=L.Id)
		join Wizyty W on T.Id=W.IdTerminu)
		
  		where W.IdPacjenta=P.Id
		group by S.Nazwa
   		for xml raw ('Wizyta'), type
		) 
	from 
	Pacjenci P
	for xml  raw('Pacjent'), type
	)
	from #nowa2
	for xml raw ('StatystykaWizyt')
1

Dla danych:

CREATE TABLE Pacjenci
    ([id] int, [nazwisko] varchar(8), [imie] varchar(5));
CREATE TABLE spec
    ([specjalnosc] varchar(10), [liczba] int, [idpacjenta] int);
    
INSERT INTO Pacjenci([id], [nazwisko], [imie])
VALUES
    (1, 'Kowalski', 'Jan'),
    (2, 'Nowak', 'Marek');
INSERT INTO spec ([specjalnosc], [liczba], [idpacjenta])
VALUES
    ('okulista', 2, 1),
    ('dermatolog', 3, 1),
    ('chirurg', 1, 2);

Zapytanie:

declare @od date
declare @do date
set @od = '2016-11-05'
set @do = '2016-11-30'

select 
	@od as '@od' 
	,@do as '@do'
	,(select
	    imie as '@imie'
		,nazwisko as '@nazwisko'
		,(select
		     specjalnosc as 'wizyta/@specjalnosc'
			 ,liczba as 'wizyta'
		from
			spec
		where
			idpacjenta = pacjenci.id
		for xml path(''), type)
	from
	    pacjenci
	for xml path('pacjent'), type)
for xml path('StatystykaWizyt')

Zwróci:

<StatystykaWizyt od="2016-11-05" do="2016-11-30">
  <pacjent imie="Jan" nazwisko="Kowalski">
    <wizyta specjalnosc="okulista">2</wizyta>
    <wizyta specjalnosc="dermatolog">3</wizyta>
  </pacjent>
  <pacjent imie="Marek" nazwisko="Nowak">
    <wizyta specjalnosc="chirurg">1</wizyta>
  </pacjent>
</StatystykaWizyt>
0

Witam ponownie, to co zaproponowałeś było bardzo dobrze zrobione, lecz pojawiają się kolejne problemy, mianowicie nowe polecenia bazujące na tej samej bazie danych ;/

  1. Zdefiniuj schemat XML w języku XML Schema, który odpowiadać będzie strukturze
    pliku xml z terminami przyjęć lekarzy
  2. Utwórz tabelę w bazie danych o schemacie
    TerminuXML (doc XML(sch)- czyli wraz ze schematem, od Date, do Date)
  3. Wstaw do tabeli TerminyXML dane wygenerowane poleceniami select na istniejącej
    bazie danych (np. z okresami odpowiadającymi kolejnym tygodniom bądź dniom)
  4. Na podstawie tabeli TerminyXML wygeneruj dla zadanego zakresu następujące zestawienie
    ImięLekarza, NazwiskoLekarza, ileDniPrzyjmuje

z pierwszym i drugim nie ma problemu, ponieważ schemat wygeneruje za pomocą fro XML schema, drugie też jest łatwe, zwyczajna tabela tyle że jako typ wpisuję XML, tylko pytanie czy ta kolumna wtedy będzie przechowywała xml'a wraz ze schematem ?
schody zaczynają się przy 3 i 4 poleceniu, za które nie wiem jak się zabrać ;/

1

ad. 1 Nie do końca, musisz wygenerować schemat i dodać do kolekcji schematów, czyli tak (xsd wygenerowane automatem, nie sprawdzałem poprawności):

CREATE XML SCHEMA COLLECTION sch AS
N'<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="StatystykaWizyt">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="pacjent" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="wizyta" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:byte">
                      <xs:attribute type="xs:string" name="specjalnosc" use="optional"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute type="xs:string" name="imie" use="optional"/>
            <xs:attribute type="xs:string" name="nazwisko" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute type="xs:date" name="od"/>
      <xs:attribute type="xs:date" name="do"/>
    </xs:complexType>
  </xs:element>
</xs:schema>' ;
GO

ad.2
Nie do końca oprócz typu xml w nawiasach wpisujesz schemat z kolekcji z pkt.1, wtedy baza wie jak ma pilnować danych

CREATE TABLE terminyXML (
    doc XML (sch)
   , od Date
   , do Date
)
GO

Do pkt 1 i2 zapoznaj się z tym: https://msdn.microsoft.com/pl-pl/library/ms176009(v=sql.110).aspx

ad. 3
No tu klasyczny insert

DECLARE @od DATE
DECLARE @do DATE
SET @od = '2016-11-05'
SET @do = '2016-11-30'
 
insert into terminyXML Values (
(SELECT 
    @od AS '@od' 
    ,@do AS '@do'
    ,(SELECT
        imie AS '@imie'
        ,nazwisko AS '@nazwisko'
        ,(SELECT
             specjalnosc AS 'wizyta/@specjalnosc'
             ,liczba AS 'wizyta'
        FROM
            spec
        WHERE
            idpacjenta = pacjenci.id
        FOR xml path(''), TYPE)
    FROM
        pacjenci
    FOR xml path('pacjent'), TYPE)
FOR xml path('StatystykaWizyt'), TYPE)
, @od
, @do)

Tu musisz zwrócić uwagę, że dopisałem dyrektywę TYPE na końcu podzapytania. Szczegóły tutaj: https://msdn.microsoft.com/en-us/library/ms190025.aspx

ad. 4
Tu jest trochę zabawy, ale nie napisze tego z głowy, a teraz nie mam dostepu do sql-a w tej chwili, warto zacząć tutaj:
https://technet.microsoft.com/en-us/library/ms190798.aspx
Jak sobie nie poradzisz to daj znać

0

w pierwszym gdy wygenerowałem schemat z automatu zrobiło mi takie coś i to się różni od tego co Ty zaproponowałeś

`<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="StatystykaWizyt">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:attribute name="_x0040_od" type="sqltypes:date" />
      <xsd:attribute name="_x0040_do" type="sqltypes:date" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
 
``
0

A rozumiesz co robi Twoje XSD?
Bo jest poprawne, pytanie tylko czy spełnia Twoje oczekiwania.

Wg. tego co przedstawiles, sprawdzany będzie tylko element Statystykawizyt z argumentami od i do, a to co w środku nie będzie sprawdzane...

Ja bym szedł raczej w strone czegos takiego:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="StatystykaWizyt">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="pacjent" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="wizyta" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:string" name="specjalnosc" use="required"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute type="xs:string" name="imie" use="required"/>
            <xs:attribute type="xs:string" name="nazwisko" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute type="xs:string" name="od"/>
      <xs:attribute type="xs:string" name="do"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
0

nie bardzo właśnie rozumiem tego mojego xsd, pytanie, jak Ty wygenerowałeś ten Twój ?

0

Ten ostatni w PHPStorm, ale to bez znaczenia (wprowadziłem) do niego pewne modyfikacje.

Tu bardziej chodzi o to, że mam wrażenie ze nawet nie docztales jak ugryźć temat xsd. Nie da się zrobić wszystkiego samymi kreatorami, jak nie rozumie się otrzymanego efektu...

0

Mamy do dyspozycji jedynie mssql

0

Do pisania xsd wystarczy notatnik czyli w ssms tez napiszesz...
Powtarzam twój nie jest zły, ale nie sprawdza struktury dokumentu. Nie wiem jakie masz założenia. Zrobić byle było czy faktycznie z sensem

0
 <?xml version="1.0" encoding="utf-8" ?>
<!-- Created with Liquid XML Studio 1.0.8.0 (http://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Przychodnia">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="Lekarze">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="Lekarz">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="0" name="Terminy">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element minOccurs="0" maxOccurs="unbounded" name="Termin">
                            <xs:complexType>
                              <xs:attribute name="data" type="xs:string" use="optional" />
                              <xs:attribute name="godzina_od" type="xs:string" use="optional" />
                              <xs:attribute name="godzina_do" type="xs:string" use="optional" />
                              <xs:attribute name="nazwaGabinetu" type="xs:string" use="optional" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="imie" type="xs:string" use="optional" />
                  <xs:attribute name="nazwisko" type="xs:string" use="optional" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="od" type="xs:string" use="optional" />
      <xs:attribute name="do" type="xs:string" use="optional" />
    </xs:complexType>
  </xs:element>
</xs:schema>

witam chłopaki ponownie, mógłby ktoś rzucić okiem czy ten schemat byłby ok do takiego XML'a :

 
declare @od date
declare @do date
set @od = '2016-11-05'
set @do = '2016-11-30'
--drop table #nowa
create table #nowa (od date, do date)
insert into #nowa values(@od,@do)

select od, do,
	(select 
	L.Imie as imie
	,L.Nazwisko as nazwisko
	,
		(																	
  		select
  		T2.Dzien as data
  		,T2.OdGodziny as godzina_od
  		,T2.DoGodziny as godzina_do
  		,G2.Nazwa as nazwaGabinetu
  
  		from
  		Terminy T2 join Gabinety G2 on G2.Id=T2.IdGabinetu
  		where T2.IdLekarza=L.Id
   		for xml raw ('Termin'), type
		) as 'Terminy'
	from 
	Lekarze L 
	for xml  raw('Lekarz'), type
	)as 'Lekarze' 
	from #nowa
	for xml raw ('Przychodnia')




0
  1. Nie podałes do jakiego XML-a to stosujesz.
  2. Sprawdzenie poprawności polega na tym, że musimy wiedzieć jakie ma mieć wymagania spełnione ten dokument, a tego nie podałeś, więc nie da się odpowiedzieć na to pytanie
0

sorki, tak wygląda ten XML

 <Przychodnia od="2016-11-05" do="2016-11-30">
  <Lekarze>
    <Lekarz imie="Jacek" nazwisko="Paździoch">
      <Terminy>
        <Termin data="2016-11-21" godzina_od="10:00:00" godzina_do="12:00:00" nazwaGabinetu="Socjal" />
        <Termin data="2016-11-28" godzina_od="11:00:00" godzina_do="13:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Alona" nazwisko="Nowak">
      <Terminy>
        <Termin data="2016-11-22" godzina_od="12:00:00" godzina_do="14:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Helga" nazwisko="Kowalska">
      <Terminy>
        <Termin data="2016-11-23" godzina_od="15:00:00" godzina_do="16:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Marcin" nazwisko="Krzynówek">
      <Terminy>
        <Termin data="2016-11-24" godzina_od="10:00:00" godzina_do="13:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Jadwiga" nazwisko="Kiepska">
      <Terminy>
        <Termin data="2016-11-25" godzina_od="09:00:00" godzina_do="11:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
  </Lekarze>
</Przychodnia>
0

No to jeszcze pytanie, czy taki XML jest poprawny bo xsd na to pozwala:

 <Przychodnia od="2016-11-05">
  <Lekarze>
    <Lekarz imie="Jacek">
      <Terminy>
        <Termin data="2016-11-21" godzina_od="10:00:00" godzina_do="12:00:00" nazwaGabinetu="Socjal" />
        <Termin data="2016-11-28" godzina_od="11:00:00" godzina_do="13:00:00" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Alona" nazwisko="Nowak">
      <Terminy>
      </Terminy>
    </Lekarz>
    <Lekarz imie="Helga" nazwisko="Kowalska">
      <Terminy>
        <Termin data="2016-11-23" godzina_od="15:00:00" godzina_do="16:00:00" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Marcin" nazwisko="Krzynówek">
      <Terminy>
        <Termin data="2016-11-24" nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
    <Lekarz imie="Jadwiga" nazwisko="Kiepska">
      <Terminy>
        <Termin nazwaGabinetu="Socjal" />
      </Terminy>
    </Lekarz>
  </Lekarze>
</Przychodnia>
0

no teraz widzę, że nie do końca ;/

1 użytkowników online, w tym zalogowanych: 0, gości: 1