SQL Server
SQL Server
Demonstrate XML SearchForTag2
Demonstrates how to use SearchForTag2.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
DECLARE @xml int
EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- Load the following XML:
-- <Test>
-- <testchild1>
-- test
-- </testchild1>
-- <testchild1>
-- test1
-- </testchild1>
-- <testchild1>
-- test2
-- </testchild1>
-- <testchild1>
-- test3
-- </testchild1>
-- <testchild1>
-- test4
-- </testchild1>
-- <testchild1>
-- test5
-- </testchild1>
-- <testchild1>
-- test6
-- </testchild1>
-- </Test>
EXEC sp_OAMethod @xml, 'LoadXml', @success OUT, '<Test><testchild1>test</testchild1><testchild1>test1</testchild1><testchild1>test2</testchild1><testchild1>test3</testchild1><testchild1>test4</testchild1><testchild1>test5</testchild1><testchild1>test6</testchild1></Test>'
DECLARE @i int
SELECT @i = 0
DECLARE @xmlSearch int
EXEC sp_OAMethod @xml, 'GetRoot', @xmlSearch OUT
DECLARE @afterPtr int
EXEC sp_OAMethod @xml, 'GetRoot', @afterPtr OUT
DECLARE @pTemp int
-- Alway begin the search from the root.
EXEC sp_OAMethod @xmlSearch, 'SearchForTag2', @iTmp0 OUT, @afterPtr, 'testchild1'
WHILE @iTmp0
BEGIN
-- If successful, xmlSearch now points to the found element.
SELECT @i = @i + 1
-- Set afterPtr = xmlSearch (so we find the next match after the one we just found)
-- Rest xmlSearch to the root of the XML tree to be searched.
EXEC sp_OAGetProperty @xmlSearch, 'Content', @sTmp0 OUT
PRINT @i + ': ' + @sTmp0
SELECT @pTemp = @afterPtr
SELECT @afterPtr = @xmlSearch
EXEC sp_OAMethod @pTemp, 'GetRoot2', NULL
SELECT @xmlSearch = @pTemp
END
EXEC @hr = sp_OADestroy @xmlSearch
EXEC @hr = sp_OADestroy @afterPtr
PRINT '----'
-- A better way:
DECLARE @sbState int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbState OUT
SELECT @i = 0
EXEC sp_OAMethod @xml, 'NextInTraversal2', @iTmp0 OUT, @sbState
WHILE @iTmp0 <> 0
BEGIN
EXEC sp_OAMethod @xml, 'TagEquals', @iTmp0 OUT, 'testchild1'
IF @iTmp0 = 1
BEGIN
EXEC sp_OAGetProperty @xml, 'Content', @sTmp0 OUT
PRINT @i + ': ' + @sTmp0
SELECT @i = @i + 1
END
END
EXEC sp_OAMethod @xml, 'GetRoot2', NULL
EXEC @hr = sp_OADestroy @xml
EXEC @hr = sp_OADestroy @sbState
END
GO