1

これは、xmlから5桁を取得するために使用しているストアドプロシージャです。

    CREATE PROCEDURE [dbo].[SP_KINGPRICE_InsertJournalFromPost]
    (
        @ResponseID bigint,
        @TransactionDetailID bigint
    )
    AS
    BEGIN
    DECLARE @info as varchar(max) = '', @Reference as varchar(max) = ''
    SET @info = (SELECT SUBSTRING(Response, CHARINDEX('<GlJournal>',Response) + 11,5) 
                 FROM SysproIntegration..ifmTransactionDetailResponse 
                 WHERE TransactionDetailResponseID = @ResponseID)
    SET @Reference = (SELECT DISTINCT Reference 
                      FROM GenJournalDetail 
                      WHERE Journal = CAST(@info as DECIMAL(5,0)))
    INSERT INTO ZJournalRecords
    (JournalNumber,Reference)

    VALUES (@info,@Reference)
    END

XMLには次のようなタグがあります。

    <GLJournal>12345</GLJournal>

XMLドキュメントにこれらのタグが1つしかない場合でも、心配する必要はありません。SPは正常に動作します。問題は、ネストされた<GLJournal>タグが2つある場合に発生します。xmlは次のようになります。

    <GLJournal>
        <SomeTag/>
        <SomeTag2/>
        <GLJournal>12345</GLJournal>
    </GLJournal>

ネストされたタグの5桁の値を取得するにはどうすればよいですか?(常に5桁になります)try catchを使用することを考えましたが、それはエレガントな解決策のようには思えません。

編集:また、問題の一部は、タグ
が1つまたは2つになる時期がわからないことです。GlJournal

4

2 に答える 2

2

タグの出現回数をカウントし、それに基づいて特定の位置をサブストリング化することにしました。

DECLARE @info as varchar(max) = '', @Reference as varchar(max) = '', @inputString as varchar(max), @searchString as varchar(max), @numberOfTags as int

SET @searchString = '<GlJournal>'
SET @inputString = (SELECT Response FROM SysproIntegration..ifmTransactionDetailResponse WHERE TransactionDetailResponseID = @ResponseID)
SET @numberOfTags = (LEN(@inputString) - 
                 LEN(REPLACE(@inputString, @searchString, ''))) /
                 LEN(@searchString)

IF @numberOfTags = 1 
BEGIN
SET @info = (SELECT SUBSTRING(Response, CHARINDEX('<GlJournal>',Response) + 11,5) FROM SysproIntegration..ifmTransactionDetailResponse WHERE TransactionDetailResponseID = @ResponseID)
SET @Reference = (SELECT DISTINCT Reference FROM GenJournalDetail WHERE Journal = CAST(@info as DECIMAL(5,0)))
END
ELSE
BEGIN
SET @info = (SELECT SUBSTRING(Response, CHARINDEX('<GlJournal>',Response) + 69,5) FROM SysproIntegration..ifmTransactionDetailResponse WHERE TransactionDetailResponseID = @ResponseID)
SET @Reference = (SELECT DISTINCT Reference FROM GenJournalDetail WHERE Journal = CAST(@info as DECIMAL(5,0)))
END
于 2012-05-14T09:47:15.413 に答える
0

適応できる int テストは次のとおりです。



declare @xml xml, @tags smallint

SET @tags = 1

-- Load @xml...
--SELECT @xml = Response 
--FROM SysproIntegration..ifmTransactionDetailResponse 
--WHERE TransactionDetailResponseID = @ResponseID

-- ... or for test...
IF @tags = 1 BEGIN
    -- Test 1 GLJournal tag
    SET @xml = '12346'
END ELSE IF @tags = 2 BEGIN
    -- Test 2 GLJournal tags
    SET @xml = '
        
        
        12345
    '
END ELSE BEGIN
    -- Test no GLJournal tags 
    SET @xml = ''
END    

DECLARE @i int; SET @i = -1

-- Try one tag    
SELECT @i = ParamValues.ID.query('GLJournal').value('.','int')
FROM @xml.nodes('/') as ParamValues(ID)

IF @i = 0   
    -- Try two tags 
    SELECT @i = ParamValues.ID.query('GLJournal').value('.','int')
    FROM @xml.nodes('/GLJournal') as ParamValues(ID)     

SELECT @i    

-- INSERT INTO ZJournalRecords... other stuff
于 2012-05-09T14:12:47.680 に答える