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

Откуда:
Сообщений: 930
Здравствуйте!
Необходимо создать xml следующего формата:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<DealReestr Date=“dd-mm-yyyy” Quantity=”Количество сделок” >
<Deal>
<DealId> Идентификатор сделки</DealId>
<DealTime>dd-mm-yyyy hh24:mi:ss</DealTime>
<SellerID>Идентификатор продавца</SellerID>
<CustomerID>Идентификатор покупателя</CustomerID>
<Amount>Сумма сделки 99999999999999.99</Amount>
<TaxSeller>Комиссия с продавца 99999999999999.99</TaxSeller>
<TaxCustomer>Комиссия с покупателя 99999999999999.99</TaxCustomer>
</Deal>
Соответственно я написал запрос,
ALTER PROCEDURE [dbo].[USP_Bank_XML] 
	@Date date
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @t TABLE(fake_id varchar(10))

	SELECT fake_id, Deal.* FROM @t DealReestr FULL outer join
   (SELECT     RIGHT(CAST(YEAR(@Date) AS NCHAR(4)), 2) + RIGHT('0' + RTRIM(CAST(MONTH(@Date) AS nchar(2))), 2) + RIGHT('0' + RTRIM(CAST(DAY(@Date) 
                      AS nchar(2))), 2) + RIGHT('000' + RTRIM(CAST(dbo.UT_Trades.TRADENO AS nchar(4))), 4) AS DealId, CONVERT(nchar(10), dbo.UT_Trades._Date, 126) 
                      + ' ' + CONVERT(nchar(8), dbo.UT_Trades._Time, 126) AS DealTime, ContactsS.ContractInternal AS SellerID, ContactsB.ContractInternal AS CustomerID, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize AS Amount, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxSeller, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxCustomer
	FROM         dbo.UT_Trades INNER JOIN
                      dbo.UT_Orders AS OrdersS ON dbo.UT_Trades.id_OrderSale = OrdersS.id_Orders INNER JOIN
                      dbo.UT_Orders AS OrdersB ON dbo.UT_Trades.id_OrderBuy = OrdersB.id_Orders INNER JOIN
                      dbo.UT_Securities ON dbo.UT_Trades.id_Security = dbo.UT_Securities.id_Security INNER JOIN
                      dbo.UT_Contacts AS ContactsS ON OrdersS.id_Contact = ContactsS.id_Contact INNER JOIN
                      dbo.UT_Contacts AS ContactsB ON OrdersB.id_Contact = ContactsB.id_Contact
	WHERE     (dbo.UT_Trades._Date = @Date)) AS Deal ON 1 = 1 for xml auto, elements
END
который возвращает данные такой структуры:
<DealReestr>
<Deal>
<DealId>0909170004</DealId>
<DealTime>2009-09-17 11:15:13</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0050</CustomerID>
<Amount>2004000.0000</Amount>
<TaxSeller>2004.0000000</TaxSeller>
<TaxCustomer>2004.0000000</TaxCustomer>
<TaxBank>200.40000000</TaxBank>
</Deal>
<Deal>
<DealId>0909170005</DealId>
<DealTime>2009-09-17 11:26:15</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0144</CustomerID>
<Amount>3582000.0000</Amount>
<TaxSeller>3582.0000000</TaxSeller>
<TaxCustomer>3582.0000000</TaxCustomer>
<TaxBank>358.20000000</TaxBank>
</Deal>
</DealReestr>

Как добавить в верхней строке данные: чтобы вместо <DealReestr> возвращалось
<?xml version="1.0" encoding="WINDOWS-1251"?>
<DealReestr Date=“dd-mm-yyyy” Quantity=”Количество сделок” >
где дата-это @Date, а количество сделок получается следующим запросом:
SELECT COUNT(*)
FROM dbo.UT_Trades
WHERE dbo.UT_Trades._Date = @Date
21 сен 09, 10:18    [7685519]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
daw
Member

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

for xml path() используйте.

а вот это:
> <?xml version="1.0" encoding="WINDOWS-1251"?>

после того как xml уже сформирован добавлять.
либо преобразовывать xml к varbinary/nvarchar(max), если прямо на стороне
сервера получить хочется, либо уже сторонними средствами.

Posted via ActualForum NNTP Server 1.4

21 сен 09, 10:48    [7685675]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
rsolanov
Member

Откуда:
Сообщений: 930
daw,

Есть похожий пример,
но там в верхней строчке одна переменная: <priority value="123">
В моем же случае их две: <DealReestr Date=“dd-mm-yyyy” Quantity=”Количество сделок” >
Каким образом тут необходимо применить for xml path?
Просто я с XML еще пока серьезно не работал, Вы уж помогите пожалуйста
21 сен 09, 10:57    [7685716]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov
daw,

Есть похожий пример,
но там в верхней строчке одна переменная: <priority value="123">
В моем же случае их две: <DealReestr Date=“dd-mm-yyyy” Quantity=”Количество сделок” >
Каким образом тут необходимо применить for xml path?
Просто я с XML еще пока серьезно не работал, Вы уж помогите пожалуйста

Через запятую написать нужное количество значений

declare @Test table (ID int)
insert into @Test values (1)
insert into @Test values (2)

select '123' [@value1],'456' [@value2],(
select
ID
from @Test
for XML PATH(''), type
) as [*]
for xml path('priority'), type
21 сен 09, 11:02    [7685750]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Glory,

Если запрос вставить в этот пример, то вот что получается:
	DECLARE @t TABLE(fake_id varchar(10))
	DECLARE @C int
	SELECT @C = COUNT(*)
	FROM dbo.UT_Trades
	WHERE dbo.UT_Trades._Date = @Date
	select 'Date' [@Date],'Quantity' [@C],(
	SELECT fake_id, Deal.* FROM @t DealReestr FULL outer join
   (SELECT     RIGHT(CAST(YEAR(@Date) AS NCHAR(4)), 2) + RIGHT('0' + RTRIM(CAST(MONTH(@Date) AS nchar(2))), 2) + RIGHT('0' + RTRIM(CAST(DAY(@Date) 
                      AS nchar(2))), 2) + RIGHT('000' + RTRIM(CAST(dbo.UT_Trades.TRADENO AS nchar(4))), 4) AS DealId, CONVERT(nchar(10), dbo.UT_Trades._Date, 126) 
                      + ' ' + CONVERT(nchar(8), dbo.UT_Trades._Time, 126) AS DealTime, ContactsS.ContractInternal AS SellerID, ContactsB.ContractInternal AS CustomerID, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize AS Amount, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxSeller, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxCustomer, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.0001 AS TaxBank
	FROM         dbo.UT_Trades INNER JOIN
                      dbo.UT_Orders AS OrdersS ON dbo.UT_Trades.id_OrderSale = OrdersS.id_Orders INNER JOIN
                      dbo.UT_Orders AS OrdersB ON dbo.UT_Trades.id_OrderBuy = OrdersB.id_Orders INNER JOIN
                      dbo.UT_Securities ON dbo.UT_Trades.id_Security = dbo.UT_Securities.id_Security INNER JOIN
                      dbo.UT_Contacts AS ContactsS ON OrdersS.id_Contact = ContactsS.id_Contact INNER JOIN
                      dbo.UT_Contacts AS ContactsB ON OrdersB.id_Contact = ContactsB.id_Contact
	WHERE     (dbo.UT_Trades._Date = @Date)) AS Deal ON 1 = 1
	for XML PATH(''), type
	) as [*]
	for xml path('DealReestr'), type

<DealReestr Date="Date" C="Quantity">
<DealId>0909170004</DealId>
<DealTime>2009-09-17 11:15:13</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0050</CustomerID>
<Amount>2004000.0000</Amount>
<TaxSeller>2004.0000000</TaxSeller>
<TaxCustomer>2004.0000000</TaxCustomer>
<TaxBank>200.40000000</TaxBank>
<DealId>0909170005</DealId>
<DealTime>2009-09-17 11:26:15</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0144</CustomerID>
<Amount>3582000.0000</Amount>
<TaxSeller>3582.0000000</TaxSeller>
<TaxCustomer>3582.0000000</TaxCustomer>
<TaxBank>358.20000000</TaxBank>
<DealId>0909170003</DealId>
<DealTime>2009-09-17 11:15:00</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0109</CustomerID>
<Amount>7488000.0000</Amount>
<TaxSeller>7488.0000000</TaxSeller>
<TaxCustomer>7488.0000000</TaxCustomer>
<TaxBank>748.80000000</TaxBank>
<DealId>0909170012</DealId>
<DealTime>2009-09-17 11:59:12</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0065</CustomerID>
<Amount>11806200.0000</Amount>
<TaxSeller>11806.2000000</TaxSeller>
<TaxCustomer>11806.2000000</TaxCustomer>
<TaxBank>1180.62000000</TaxBank>
<DealId>0909170008</DealId>
<DealTime>2009-09-17 11:45:36</DealTime>
<SellerID>R0013</SellerID>
<CustomerID>K0019</CustomerID>
<Amount>1500000.0000</Amount>
<TaxSeller>1500.0000000</TaxSeller>
<TaxCustomer>1500.0000000</TaxCustomer>
<TaxBank>150.00000000</TaxBank>
<DealId>0909170001</DealId>
<DealTime>2009-09-17 11:15:00</DealTime>
<SellerID>K0013</SellerID>
<CustomerID>K0003</CustomerID>
<Amount>3132000.0000</Amount>
<TaxSeller>3132.0000000</TaxSeller>
<TaxCustomer>3132.0000000</TaxCustomer>
<TaxBank>313.20000000</TaxBank>
</DealReestr>

Необходимо чтобы сделки разделялись <Deal> </Deal> как было показано в предыдущем вопросе.
Но главное то, что в верхней строчке вместо значений даты и количество сделок, запрос возвращает наименование этих переменных.
21 сен 09, 11:21    [7685874]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
vino
Member

Откуда:
Сообщений: 1191
	DECLARE @t TABLE(fake_id varchar(10))
	DECLARE @C int
	SELECT @C = COUNT(*)
	FROM dbo.UT_Trades
	WHERE dbo.UT_Trades._Date = @Date
	select @Date [Date], @C [Quantity],
	 (SELECT fake_id, Deal.* FROM @t DealReestr FULL outer join
	   (SELECT     RIGHT(CAST(YEAR(@Date) AS NCHAR(4)), 2)
		 + RIGHT('0' + RTRIM(CAST(MONTH(@Date) AS nchar(2))), 2)
		 + RIGHT('0' + RTRIM(CAST(DAY(@Date) 
                      AS nchar(2))), 2) + RIGHT('000' + RTRIM(CAST(dbo.UT_Trades.TRADENO AS nchar(4))), 4) AS DealId, CONVERT(nchar(10), dbo.UT_Trades._Date, 126) 
                      + ' ' + CONVERT(nchar(8), dbo.UT_Trades._Time, 126) AS DealTime, ContactsS.ContractInternal AS SellerID, ContactsB.ContractInternal AS CustomerID, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize AS Amount, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxSeller, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxCustomer, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.0001 AS TaxBank
	FROM         dbo.UT_Trades INNER JOIN
                      dbo.UT_Orders AS OrdersS ON dbo.UT_Trades.id_OrderSale = OrdersS.id_Orders INNER JOIN
                      dbo.UT_Orders AS OrdersB ON dbo.UT_Trades.id_OrderBuy = OrdersB.id_Orders INNER JOIN
                      dbo.UT_Securities ON dbo.UT_Trades.id_Security = dbo.UT_Securities.id_Security INNER JOIN
                      dbo.UT_Contacts AS ContactsS ON OrdersS.id_Contact = ContactsS.id_Contact INNER JOIN
                      dbo.UT_Contacts AS ContactsB ON OrdersB.id_Contact = ContactsB.id_Contact
	WHERE     (dbo.UT_Trades._Date = @Date)) AS Deal ON 1 = 1
	for XML PATH(''), type
	) as [*]
	for xml path('DealReestr'), type
21 сен 09, 11:33    [7685977]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
vino
Member

Откуда:
Сообщений: 1191
	DECLARE @t TABLE(fake_id varchar(10))
	DECLARE @C int
	SELECT @C = COUNT(*)
	FROM dbo.UT_Trades
	WHERE dbo.UT_Trades._Date = @Date
	select @Date [Date], @C [Quantity],
	 (SELECT fake_id, Deal.* FROM @t DealReestr FULL outer join
	   (SELECT     RIGHT(CAST(YEAR(@Date) AS NCHAR(4)), 2)
		 + RIGHT('0' + RTRIM(CAST(MONTH(@Date) AS nchar(2))), 2)
		 + RIGHT('0' + RTRIM(CAST(DAY(@Date) 
                      AS nchar(2))), 2) + RIGHT('000' + RTRIM(CAST(dbo.UT_Trades.TRADENO AS nchar(4))), 4) AS DealId, CONVERT(nchar(10), dbo.UT_Trades._Date, 126) 
                      + ' ' + CONVERT(nchar(8), dbo.UT_Trades._Time, 126) AS DealTime, ContactsS.ContractInternal AS SellerID, ContactsB.ContractInternal AS CustomerID, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize AS Amount, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxSeller, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxCustomer, 
                      dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.0001 AS TaxBank
	FROM         dbo.UT_Trades INNER JOIN
                      dbo.UT_Orders AS OrdersS ON dbo.UT_Trades.id_OrderSale = OrdersS.id_Orders INNER JOIN
                      dbo.UT_Orders AS OrdersB ON dbo.UT_Trades.id_OrderBuy = OrdersB.id_Orders INNER JOIN
                      dbo.UT_Securities ON dbo.UT_Trades.id_Security = dbo.UT_Securities.id_Security INNER JOIN
                      dbo.UT_Contacts AS ContactsS ON OrdersS.id_Contact = ContactsS.id_Contact INNER JOIN
                      dbo.UT_Contacts AS ContactsB ON OrdersB.id_Contact = ContactsB.id_Contact
	WHERE     (dbo.UT_Trades._Date = @Date)) AS Deal ON 1 = 1
	for XML PATH(''), type
	) as Deal
	for xml path('DealReestr'), type
21 сен 09, 11:36    [7686014]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
rsolanov
Member

Откуда:
Сообщений: 930
vino,

Да, и это немного не то что нужно :-)
21 сен 09, 11:39    [7686034]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
vino
Member

Откуда:
Сообщений: 1191
rsolanov, вы попробовали последний вариант?
21 сен 09, 11:41    [7686052]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
vino
Member

Откуда:
Сообщений: 1191
rsolanov
... xml следующего формата:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<DealReestr Date=“dd-mm-yyyy” Quantity=”Количество сделок” >
<Deal>
<DealId> Идентификатор сделки</DealId>
<DealTime>dd-mm-yyyy hh24:mi:ss</DealTime>
<SellerID>Идентификатор продавца</SellerID>
<CustomerID>Идентификатор покупателя</CustomerID>
<Amount>Сумма сделки 99999999999999.99</Amount>
<TaxSeller>Комиссия с продавца 99999999999999.99</TaxSeller>
<TaxCustomer>Комиссия с покупателя 99999999999999.99</TaxCustomer>
</Deal>
Соответственно...

это не корректный xml, так как последняя строка должна быть, конечно же
</DealReestr>
поэтому все должно соответствовать. А у вас что получается?
21 сен 09, 11:44    [7686080]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
rsolanov
Member

Откуда:
Сообщений: 930
vino
rsolanov, вы попробовали последний вариант?

Да, вот что возвращает последний вариант:
<DealReestr>
  <Date>2009-09-17</Date>
  <Quantity>15</Quantity>
  <Deal>
    <DealId>0909170004</DealId>
    <DealTime>2009-09-17 11:15:13</DealTime>
    <SellerID>R0013</SellerID>
    <CustomerID>K0050</CustomerID>
    <Amount>2004000.0000</Amount>
    <TaxSeller>2004.0000000</TaxSeller>
    <TaxCustomer>2004.0000000</TaxCustomer>
    <TaxBank>200.40000000</TaxBank>
    <DealId>0909170005</DealId>
    <DealTime>2009-09-17 11:26:15</DealTime>
    <SellerID>R0013</SellerID>
    <CustomerID>K0144</CustomerID>
    <Amount>3582000.0000</Amount>
    <TaxSeller>3582.0000000</TaxSeller>
    <TaxCustomer>3582.0000000</TaxCustomer>
    <TaxBank>358.20000000</TaxBank>
    <DealId>0909170003</DealId>
    <DealTime>2009-09-17 11:15:00</DealTime>
    <SellerID>R0013</SellerID>
    <CustomerID>K0109</CustomerID>
    <Amount>7488000.0000</Amount>
    <TaxSeller>7488.0000000</TaxSeller>
    <TaxCustomer>7488.0000000</TaxCustomer>
    <TaxBank>748.80000000</TaxBank>
  </Deal>
</DealReestr>
То есть сделки не разделяются тегами <Deal> и </Deal>
В этом случае эти теги охватывают все сделки.
Да и две верхние строки должны быть "вытянуты" в одну, как показано в примере.
21 сен 09, 11:47    [7686094]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
daw
Member

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

	DECLARE @C int

	SELECT @C = COUNT(*)
	FROM dbo.UT_Trades
	WHERE dbo.UT_Trades._Date = @Date

	select @Date [@Date], @C [@Quantity],
	 (SELECT     RIGHT(CAST(YEAR(@Date) AS NCHAR(4)), 2)
		 + RIGHT('0' + RTRIM(CAST(MONTH(@Date) AS nchar(2))), 2)
		 + RIGHT('0' + RTRIM(CAST(DAY(@Date)
                       AS nchar(2))), 2) + RIGHT('000' + RTRIM(CAST(dbo.UT_Trades.TRADENO AS nchar(4))), 4) AS DealId, 
CONVERT(nchar(10), dbo.UT_Trades._Date, 126)
                       + ' ' + CONVERT(nchar(8), dbo.UT_Trades._Time, 126) AS DealTime, ContactsS.ContractInternal AS 
SellerID, ContactsB.ContractInternal AS CustomerID,
                       dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize AS Amount,
                       dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxSeller,
                       dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.001 AS TaxCustomer,
                       dbo.UT_Trades.Price * dbo.UT_Trades.LotCount * dbo.UT_Securities.LotSize * 0.0001 AS TaxBank
	FROM         dbo.UT_Trades INNER JOIN
                       dbo.UT_Orders AS OrdersS ON dbo.UT_Trades.id_OrderSale = OrdersS.id_Orders INNER JOIN
                       dbo.UT_Orders AS OrdersB ON dbo.UT_Trades.id_OrderBuy = OrdersB.id_Orders INNER JOIN
                       dbo.UT_Securities ON dbo.UT_Trades.id_Security = dbo.UT_Securities.id_Security INNER JOIN
                       dbo.UT_Contacts AS ContactsS ON OrdersS.id_Contact = ContactsS.id_Contact INNER JOIN
                       dbo.UT_Contacts AS ContactsB ON OrdersB.id_Contact = ContactsB.id_Contact
	WHERE     (dbo.UT_Trades._Date = @Date)
	for XML PATH('Deal'), type
	) as [*]
	for xml path('DealReestr')

Posted via ActualForum NNTP Server 1.4

21 сен 09, 11:57    [7686192]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
rsolanov
Member

Откуда:
Сообщений: 930
daw,

Даже не верится! Все работает так как надо! Огромное спасибо!
21 сен 09, 12:01    [7686220]     Ответить | Цитировать Сообщить модератору
 Re: XML  [new]
vino
Member

Откуда:
Сообщений: 1191
daw, спасибо за поправку
21 сен 09, 12:03    [7686237]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить