powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sqlXmlBulkLoader и загрузка бинарных атрибутов
18 сообщений из 18, страница 1 из 1
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028601
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XML
Код: xml
1.
<Response ><Data><currentstamp stamp="0x000000001c098c92"/></Data></Response>



XSD
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  <xs:element name="Response"  sql:is-constant="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Data" minOccurs="0" maxOccurs="1" sql:is-constant="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="currentstamp" minOccurs="0" maxOccurs="unbounded"
                         sql:relation="Сurrentstamp" 
                         sql:key-fields="stamp"
              >
                <xs:complexType>

                  <xs:attribute name="stamp" type="xs:hexBinary" sql:datatype="varbinary(64)"/>

                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim objBL 
Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB;data source=.\XXXX;database=tempdb;integrated security=SSPI"
objBL.ErrorLogFile = "error.log"
objBL.CheckConstraints = 1
objBL.XMLFragment = 0
objBL.SchemaGen = 1
objBL.SGDropTables = 1
objBL.IgnoreDuplicateKeys = 0
objBL.ForceTableLock = 1
objBL.BulkLoad       = 1
objBL.KeepIdentity = 1
objBL.Execute "xsd\state.xsd", "xml\state.xml"


Отгребаю

Код: xml
1.
<?xml version="1.0"?><Error><Record><HResult>0x80004005</HResult><SQLState>22018</SQLState><NativeError>0</NativeError><Source>Microsoft OLE DB Provider for SQL Server</Source><Description><![CDATA[Недопустимое символьное значение для спецификации приведения.]]></Description></Record></Error>



Таблица успешно создается, НО вставить - не выходит.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE [dbo].[Сurrentstamp](
	[stamp] [varbinary](64) NOT NULL,
 CONSTRAINT [Сurrentstamp_pk_1] PRIMARY KEY CLUSTERED 
(
	[stamp] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] 




Может есть знающие секрет этого фокуса?
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028619
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Секрет в "0x"
Код: sql
1.
2.
3.
4.
select
 cast('' as xml).value('xs:hexBinary(sql:column("t.b"))', 'binary(1)')
from
 (values ('0x01'), ('01')) t(b)
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028624
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Секрет в "0x"
Код: sql
1.
2.
3.
4.
select
 cast('' as xml).value('xs:hexBinary(sql:column("t.b"))', 'binary(1)')
from
 (values ('0x01'), ('01')) t(b)



Спасибо, канешно. Это здорово.

Надо массированно грузить SQLXMLBulkLoad.
Т.е. править исходный XML не вариант.

Может есть еще знатоки 80 левела?
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028625
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Т.е. править исходный XML не вариант.
Тогда грузить строкой. Конвертировать потом.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028630
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
aleks222
Т.е. править исходный XML не вариант.
Тогда грузить строкой. Конвертировать потом.

Это я и делаю.
Хочется проще и быстрее.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028827
FantomGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы быстро загрузить xml он должен быть валидный.

Если Вы проверите исходный xml Вашей схемой то получите ошибку, потому что hexBinary это
hexBinary has a lexical representation where each binary octet is encoded as a character tuple, consisting of two hexadecimal digits ([0-9a-fA-F]) representing the octet code. For example, "0FB7" is a hex encoding for the 16-bit integer 4023 (whose binary representation is 111110110111). тут

Поэтому либо сделать корректным поле stamp или конвертировать данные после загрузки.
PS: в название таблицы "Сurrentstamp" первая буква русская.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028862
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FantomGood
Чтобы быстро загрузить xml он должен быть валидный.
Если Вы проверите исходный xml Вашей схемой то получите ошибку

Да, факт:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
use [data]
go
CREATE XML SCHEMA COLLECTION BinaryValueCollection
AS
N'<?xml version="1.0" encoding="UTF-16"?>
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Response">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Data">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="currentstamp">
                <xs:complexType>
                  <xs:attribute name="stamp" type="xs:hexBinary" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>';
GO
declare
  @x xml(BinaryValueCollection);
--Msg 6926, Level 16, State 1, Line 31
--XML Validation: Invalid simple type value: '0x000000001c098c92'. Location: /*:Response[1]/*:Data[1]/*:currentstamp[1]/@*:stamp
set @x=N'<Response><Data><currentstamp stamp="0x000000001c098c92" /></Data></Response>';
-- Ok
set @x=N'<Response><Data><currentstamp stamp="000000001c098c92" /></Data></Response>';
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028865
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028892
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.

Не в рамках троллинга, информации получения для.
Предположим, у вас есть около 100 тысяч файлов, размером от 10 кБайт до 100 Мбайт, сложно-подчиненный xml из 10 таблиц, около 300 полей.
Сколько займет верификация и загрузка в набор реляционно-связанных таблиц с синтетическими ключами?
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028912
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.


Без SSIS и прочего геморроя.

Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028953
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.

Не в рамках троллинга, информации получения для.
Предположим, у вас есть около 100 тысяч файлов, размером от 10 кБайт до 100 Мбайт, сложно-подчиненный xml из 10 таблиц, около 300 полей.
Сколько займет верификация и загрузка в набор реляционно-связанных таблиц с синтетическими ключами?

Более-менее точно не могу сказать, слишком большой разброс размера. Также сильно повлияет количество ядер (распараллеливание).
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек. Парсить можно было бы и больше, но не успевает пакетная запись в БД (гарантированное сохранение принятых сообщений). Задержка обновления основного набора данных (разрешение ключей в суррогатные) на максимальных скоростях держится в пределах минуты от момента получения, норма - полминуты.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028955
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.
Настоящие индейцы забирают все значения в строковом виде и преобразуют их к нужному виду самостоятельно.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028957
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
Также сильно повлияет количество ядер (распараллеливание).
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек. Парсить можно было бы и больше, но не успевает пакетная запись в БД...
Это ещё не принимая во внимание Scale-Out на кластерах, на том-же Azure архитектурно вариантов решения таких задач достаточно,
начиная от Scala-Spark на DataBricks, DataLake (Gen1 с его U-SQL через кастомные C# Extractors)
или Gen2 напрямую при помощи ADF/DataFactory, даже тот-же современный MPP/Synapse (бывший APS/PDW) эти вопросы решает интегрировано.
Так что вопрос чисто местной политики по балансу требуемой цены/скорости{производительности} в пределах SLA как решать..
можно и тысячу Kитайцев/Индусов нанять в ручную переписывать...
Azure Service-Bus / Queue storage вполне справляется с такими нагрузками (на SQL вроде Service Broker назывался),
там на самом дешевом плане предел вроде 2 тыс сообщений в секунду на контейнере.. На Service Bus размер сообщения до 1Мб (против 64КБ на Queue)

У нас пиковые нагрузки побольше - поэтому потоковые букеты JSON/XML из разных источников пробуем мешать с Cosmos DB
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028984
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек.

sqlXmlBulkLoad загружает раз в пять быстрее.
Одной строчкой кода и одной схемой.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028986
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.

Это by design так:
In XQuery, most dynamic errors are mapped to an empty sequence ("()"). However, these are the two exceptions: Overflow conditions in XQuery aggregator functions and XML-DML validation errors. Note that most dynamic errors are mapped to an empty sequence. Otherwise, query execution that takes advantages of the XML indexes may raise unexpected errors. Therefore, to provide an efficient execution without generating unexpected errors, SQL Server Database Engine maps dynamic errors to ().
https://docs.microsoft.com/en-us/sql/xquery/error-handling-xquery?view=sql-server-ver15

.Евгений
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

Только XmlReader (в виде инкапсулирующей оберки, которая имплементирует IDataReader). Остальные 2 варианта предполагают полную загрузку документа, и хранение в памяти его разобранной модели. Если XML будет с пяток гигов, то, сами понимаете.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40028996
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
.ЕвгенийПоэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

Только XmlReader (в виде инкапсулирующей оберки, которая имплементирует IDataReader). Остальные 2 варианта предполагают полную загрузку документа, и хранение в памяти его разобранной модели. Если XML будет с пяток гигов, то, сами понимаете.Ага, там квадратичная зависимость скорости импорта от объёма документа. Плюс линейная потребления памяти, а если документ не 1 гб, а 100?

XmlReader очень быстр, я его использовал, притом в режиме балка, имплементируя IDataReader, но код, конечно, получается немаленький.
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40029002
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
.Евгений
В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек.

sqlXmlBulkLoad загружает раз в пять быстрее.
Одной строчкой кода и одной схемой.

Я же объяснил, что скорость у меня ограничивается не парсингом, а совсем другим.
Поскольку объемы отдельных XML не измеряются гигабайтами, то прекрасно работает связка XMLDocument + XPathNavigator, которой подсовывается набор подготовленных аналитиком XPath, а я просто маплю их на поля таблиц - что гораздо проще, чем составление схемы или парсинг посредством SQL.
alexeyvg
XmlReader очень быстр, я его использовал, притом в режиме балка, имплементируя IDataReader, но код, конечно, получается немаленький.
Я как-то раз видел способ импорта asm-кода внутрь C#, думаю, что это было бы действительно быстро
...
Рейтинг: 0 / 0
sqlXmlBulkLoader и загрузка бинарных атрибутов
    #40029031
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову сказать, с xs:hexBinary не сталкивался, а base64Binary обрабатывается без проблем.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sqlXmlBulkLoader и загрузка бинарных атрибутов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]