web-dev-qa-db-ja.com

MS SQL Serverのxml列の値をトリミングする

XML列を持つデータベースがあります。 xml列のxml値を更新(トリム)しようとしています。 Windows、SQL Server 2008 Expressで実行しています。

Xqueryで直接トリミングする方法が見つからなかったので、値を選択してみました。ここにSQLがあります

select RTRIM(LTRIM(col2.value('(/Root/Row/Rowid/text())[1]','varchar(20)')))
from   dbo.T1

しかし、今私はこのxml値を更新する方法を取得していません。

Xml値を直接トリミングする方法はありますか?そうでない場合、どのように値をトリムできますか?

テーブルの単一の行を更新するのではなく、テーブルのすべての行のxml値をトリミングしようとしています

2
IT researcher

sql:column 関数とCommon Table Expression(CTE)を使用して、次のように実行できます。

CREATE TABLE #tmp ( col2 XML )

INSERT INTO #tmp ( col2 )
VALUES ( '<Root>
    <Row>
        <Rowid>trim this value    </Rowid>
    </Row>
</Root>' )


SELECT 'before' s, *
FROM #tmp

;WITH cte AS
(
SELECT col2, RTRIM( LTRIM( col2.value('(/Root/Row/Rowid/text())[1]','VARCHAR(20)' )))  trimmedColumn
FROM #tmp
)
UPDATE cte
SET col2.modify('replace value of (Root/Row/Rowid/text())[1] with sql:column("trimmedColumn")')


SELECT 'after' s, *
FROM #tmp

-- Cleanup
DROP TABLE #tmp

私の結果: Results after update

8
wBob