powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / LoadXMLFromFile
5 сообщений из 5, страница 1 из 1
LoadXMLFromFile
    #33692909
mayday86rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воспользовался примером процедуры для курса валют ЦБРФ:
CREATE PROCEDURE LoadXMLFromFile
(
@tcFileName VARCHAR(255),
@tcXMLString VARCHAR(8000) OUTPUT
) AS
BEGIN
-- Scratch variables used in the script
DECLARE @retVal INT
DECLARE @oXML INT
DECLARE @errorSource VARCHAR(8000)
DECLARE @errorDescription VARCHAR(8000)
DECLARE @loadRetVal INT

-- Initialize the XML document
EXEC @retVal = sp_OACreate 'MSXML2.DOMDocument', @oXML OUTPUT
IF (@retVal <> 0)
BEGIN
-- Trap errors if any
EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
RAISERROR (@errorDescription, 16, 1)

-- Release the reference to the COM object
EXEC sp_OADestroy @oXML
RETURN
END

EXEC @retVal = sp_OASetProperty @oXML, 'async', 0

IF @retVal <> 0
BEGIN
-- Trap errors if any
EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
RAISERROR (@errorDescription, 16, 1)

-- Release the reference to the COM object
EXEC sp_OADestroy @oXML
RETURN
END

-- Load the XML into the document
EXEC @retVal = sp_OAMethod @oXML, 'load', @loadRetVal OUTPUT, @tcFileName
IF (@retVal <> 0)
BEGIN
-- Trap errors if any
EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
RAISERROR (@errorDescription, 16, 1)

-- Release the reference to the COM object
EXEC sp_OADestroy @oXML
RETURN
END

-- Get the loaded XML
EXEC @retVal = sp_OAMethod @oXML, 'xml', @tcXMLString OUTPUT
IF (@retVal <> 0)
BEGIN
-- Trap errors if any
EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
RAISERROR (@errorDescription, 16, 1)
-- Release the reference to the COM object
EXEC sp_OADestroy @oXML
RETURN
END
-- Release the reference to the COM object
EXEC sp_OADestroy @oXML

END
Только нужна обработка других XML-файлов типа
<root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<good EAN="032400633003" name="Варежки" price="19.95" />
<good EAN="032400644003" name="Варежки" price="10" />
<good EAN="032413545003" name="Перчатки" price="19.95" />
<good EAN="032400675003" name="Варежки" price="19.95" />
<good EAN="032415033003" name="Варежки" price="22.45" />
<good EAN="032415034003" name="Варежки" price="22.45" />
<good EAN="032320675003" name="Шарф" price="10" />
<good EAN="032320647003" name="Шарф" price="29.95" />
<good EAN="032435226003" name="Варежки" price="15" />
<good EAN="032435233003" name="Варежки" price="15" />
<good EAN="032435244003" name="Варежки" price="34.95" />
<good EAN="032435247003" name="Варежки" price="15" />
<good EAN="032424526003" name="Перчатки" price="34.95" />
<good EAN="032424533003" name="Перчатки" price="34.95" />
<good EAN="032424544003" name="Перчатки" price="34.95" />
<good EAN="032424545003" name="Перчатки" price="34.95" />
<good EAN="032424547003" name="Перчатки" price="15" />
<good EAN="032432033003" name="Варежки" price="29.95" />
<good EAN="032432044003" name="Варежки" price="29.95" />
<good EAN="032432047003" name="Варежки" price="29.95" />
<good EAN="032445233003" name="Варежки" price="34.95" />
<good EAN="032445244003" name="Варежки" price="34.95" />
<good EAN="032444226003" name="Перчатки" price="39.95" />
<good EAN="032444233003" name="Перчатки" price="39.95" />
<good EAN="032442433003" name="Варежки" price="29.95" />
<good EAN="032442469003" name="Варежки" price="29.95" />
<good EAN="032444244003" name="Перчатки" price="39.95" />
<good EAN="032443631003" name="Варежки" price="34.95" />
<good EAN="032443650003" name="Варежки" price="34.95" />
<good EAN="032444273003" name="Перчатки" price="39.95" />
<good EAN="032444026003" name="Варежки" price="37.45" />
<good EAN="032444033003" name="Варежки" price="37.45" />
<good EAN="032444044003" name="Варежки" price="37.45" />
<good EAN="032444049003" name="Варежки" price="37.45" />
<good EAN="032444073003" name="Варежки" price="37.45" />
<good EAN="032415044003" name="Варежки" price="22.45" />
<good EAN="032415049003" name="Варежки" price="22.45" />
<good EAN="030006501003" name="Шапка" price="29.95" />
<good EAN="030006502003" name="Шапка" price="29.95" />
<good EAN="030006503003" name="Шапка" price="29.95" />
<good EAN="030006504003" name="Шапка" price="29.95" />
<good EAN="032424573003" name="Перчатки" price="34.95" />
<good EAN="032424569003" name="Перчатки" price="34.95" />
<good EAN="032415073003" name="Варежки" price="22.45" />
<good EAN="032455279003" name="Варежки" price="37.45" />
<good EAN="032452433003" name="Варежки" price="29.95" />
<good EAN="030242426003" name="Перчатки" price="29.95" />
<good EAN="030242433003" name="Перчатки" price="29.95" />
<good EAN="032454226003" name="Перчатки" price="39.95" />
<good EAN="030242454003" name="Перчатки" price="29.95" />
<good EAN="032452434003" name="Варежки" price="29.95" />
<good EAN="030242479003" name="Перчатки" price="29.95" />
<good EAN="032454233003" name="Перчатки" price="39.95" />
<good EAN="030242490003" name="Перчатки" price="29.95" />
<good EAN="032452454003" name="Варежки" price="29.95" />
<good EAN="032454234003" name="Перчатки" price="39.95" />
<good EAN="032454279003" name="Перчатки" price="39.95" />
<good EAN="032454026003" name="Варежки" price="37.45" />
<good EAN="032452033003" name="Варежки" price="34.95" />
<good EAN="032453825003" name="Варежки" price="32.45" />
<good EAN="032454032003" name="Варежки" price="37.45" />
<good EAN="032454326003" name="Варежки" price="39.95" />
<good EAN="032454033003" name="Варежки" price="37.45" />
<good EAN="032453879003" name="Варежки" price="32.45" />
<good EAN="032454034003" name="Варежки" price="37.45" />
<good EAN="032454079003" name="Варежки" price="37.45" />
<good EAN="032452054003" name="Варежки" price="34.95" />
<good EAN="032454333003" name="Варежки" price="39.95" />
<good EAN="032452069003" name="Варежки" price="34.95" />
<good EAN="032454334003" name="Варежки" price="39.95" />
<good EAN="032452079003" name="Варежки" price="34.95" />
<good EAN="032455026003" name="Перчатки" price="39.95" />
<good EAN="032455033003" name="Перчатки" price="39.95" />
<good EAN="032455034003" name="Перчатки" price="39.95" />
<good EAN="032455226003" name="Варежки" price="37.45" />
<good EAN="032455233003" name="Варежки" price="37.45" />
<good EAN="032455234003" name="Варежки" price="37.45" />
</root>
Проблема в том, что после примерно 76 записей вываливается ошибка в строке EXEC @retVal = sp_OAMethod @oXML, 'xml', @tcXMLString OUTPUT
При этом общий размер документа XML чуть более 4Кб.
Может кто подскажет, где искать проблему? Если перед выборкой поставить ещё какую-нибудь выборку, то число меняется от 76ти. Может это как-то связано с временем на обработку?

(Ошибку не успеваю написать..)
...
Рейтинг: 0 / 0
LoadXMLFromFile
    #33693560
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayday86rus
...
CREATE PROCEDURE LoadXMLFromFile
(
...
@tcXMLString VARCHAR(8000) OUTPUT -- Get the loaded XML
...
EXEC @retVal = sp_OAMethod @oXML, 'xml', @tcXMLString OUTPUT
...
При этом общий размер документа XML чуть более 4Кб.
...
(Ошибку не успеваю написать..)

Во-первых, вполне безболезненно можно заменить параметр процедуры @tcXMLString VARCHAR(8000) OUTPUT на @tcXMLString NTEXT OUTPUT (в любом случае 4 гига юникодовской строки лучше чем ~8K символов ASCII).
Во-вторых - где гарантия, что sp_OAMethod возвращает вам в @tcXMLString OUTPUT именно VARCHAR?
(поищите в BOL статью с названием "Data Type Conversions Using OLE Automation Stored Procedures").
В-третьих - ну почему все горе-"OLE-автоматизаторы" считают своим долгом вызывать sp_OAMethod там, где необходимо вызывать sp_OAGetProperty!?
(а "xml" у "'MSXML2.DOMDocument" именно свойство, а не метод)
BOL (найдите 10 отличий)
Syntax
sp_OAGetProperty objecttoken,
propertyname
[ , propertyvalue OUTPUT ]
[ , index...]


Syntax
sp_OAMethod objecttoken,
methodname
[ , returnvalue OUTPUT ]
[ , [ @parametername = ] parameter [ OUTPUT ]
[ ...n ] ]


Третий параметр sp_OAMethod (returnvalue OUTPUT) - это не возможное значение свойства, а флаг возврата метода (что-то типа структурки hresult), и если он в некоторых случаях совпадает с нужными вам данными, то это еще не повод строить на таких допущениях реальное продуктивное решение...

Ну и, в-четвертых - покажете ошибку, будет вам и помощь более конкретная...

Удачи!!
...
Рейтинг: 0 / 0
LoadXMLFromFile
    #33695566
mayday86rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за развёрнутый комментарий. Попробовал сделать - встала проблема. Как возможно изменение переменной NTEXT, если она сама по себе является внешней переменной? Её, получается, изменять нельзя....
...
Рейтинг: 0 / 0
LoadXMLFromFile
    #33695661
mayday86rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е.
авторEXEC sp_OAGetProperty @oXML, 'xml', @tcXMLString OUTPUT
эта команда не может поменять значение @tcXMLString типа ntext
...
Рейтинг: 0 / 0
LoadXMLFromFile
    #33695682
mayday86rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос уже остался лишь для интереса. Принято решение просто изменить функционал, чтобы xml-файл не превышал 8Кб без последствий
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / LoadXMLFromFile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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