1

以下はSSMSの私のコードです。そして正常に動作しています。

しかし、問題は私@p1='variable1/variable2'であり、結果を得ることができません。

ありがとうございました。

DECLARE @SSRXML xml = '<root>
                        <variable1>
                            <variable2>
                                <variable3>
                                    <name>Alvin</name>
                                    <country>Singapore</country>
                                </variable3>
                            </variable2>
                        </variable1>
                       </root>'

DECLARE @p1 VARCHAR(MAX) =  'variable1'; 

SELECT @SSRXML.query('//root/*[local-name()=sql:variable("@p1")]' )
4

2 に答える 2

1

多分この解決策は役に立ちますか?

DECLARE @p1 VARCHAR(MAX) = 'variable1'
    , @p2 VARCHAR(MAX) = 'variable2';

SELECT @SSRXML.query('//root/*[local-name()=sql:variable("@p1")]/*[local-name()=sql:variable("@p2")]');

'variable1/variable2' の意味と、取得したい結果が明確ではありません。

@p 変数の最大ノード数がわかっている場合は、次のソリューションを使用できます。

DECLARE @p0 VARCHAR(MAX) = 'variable1/variable2/variable3'
    , @p1 VARCHAR(MAX)
    , @p2 VARCHAR(MAX)
    , @p3 VARCHAR(MAX)
    , @p4 VARCHAR(MAX)
;
SET @p0 = REPLACE (@p0, '/', '.');

SELECT @p1 = ISNULL (PARSENAME(@p0, 1), '')
    , @p2 = ISNULL (PARSENAME(@p0, 2), '')
    , @p3 = ISNULL (PARSENAME(@p0, 3), '')
    , @p4 = ISNULL (PARSENAME(@p0, 4), '')
;

SELECT @SSRXML.query('
if (sql:variable("@p4") != "")
then /root/*[local-name()=sql:variable("@p4")]/*[local-name()=sql:variable("@p3")]/*[local-name()=sql:variable("@p2")]/*[local-name()=sql:variable("@p1")]
else (
    if (sql:variable("@p3") != "")
    then /root/*[local-name()=sql:variable("@p3")]/*[local-name()=sql:variable("@p2")]/*[local-name()=sql:variable("@p1")]
    else (
        if (sql:variable("@p2") != "")
        then /root/*[local-name()=sql:variable("@p2")]/*[local-name()=sql:variable("@p1")]
        else (
            if (sql:variable("@p1") != "")
            then /root/*[local-name()=sql:variable("@p1")]
            else /root
        )
    )
)');
于 2013-09-05T09:12:18.903 に答える