3

次のクエリを使用して、xml列フィールドから値を選択しようとしています。

SELECT LTRIM(LocalData.value('(/root/questionphrase[@ln="nl"]/xhtml/p)[1]', 'nvarchar(max)'))
FROM Question

私のxmlの構造:

<root>
  <questionphrase ln="nl">
    <xhtml>
      <p>
         Data I want to select</p>
    </xhtml>
  </questionphrase>
</root>

期待値を取り戻していますが、すべて2つの空白で始まります。調べてみると、文字列の先頭にタブchar(9)と改行文字があります。char(10)手動で置き換えることなく、出力からこれらの文字を取り除く一般的な方法はありますか?私はLTRIMとRTRIMがうまくいくことを望んでいましたが、今のところ運がありません。

注:文字列の最初と最後の文字のみを置き換えたい

4

2 に答える 2

2

個別のトリム関数を作成できます。

トリム機能:

CREATE FUNCTION dbo.LTrimE(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @trimchars VARCHAR(10)
    SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
    IF @str LIKE '[' + @trimchars + ']%' SET @str = SUBSTRING(@str, PATINDEX('%[^' + @trimchars + ']%', @str), 8000)
    RETURN @str
END
GO
CREATE FUNCTION dbo.RTrimE(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @trimchars VARCHAR(10)
    SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
    IF @str LIKE '%[' + @trimchars + ']'
    SET @str = REVERSE(dbo.LTrimX(REVERSE(@str)))
    RETURN @str
END
GO
CREATE FUNCTION dbo.TrimE(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
    RETURN dbo.LTrimE(dbo.RTrimE(@str))
END
GO

クエリは次のようになります

SELECT dbo.TRIME(LocalData.value('(/root/questionphrase[@ln="nl"]/xhtml/p)[1]',
'nvarchar(max)'))
FROM Question

トリム機能の元のソース

于 2013-01-07T14:40:47.457 に答える
2

文字列値をパラメーターとして受け取る CLR 関数の作成を試みることができます。

次に、C#で必要なことを行い、次のような正しいトリミングされた値を返します。

    [Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.None)]
    [return: SqlFacet(MaxSize = -1)]
    public static SqlString TrimValue([SqlFacet(MaxSize = -1)] SqlString value) {
        if(value.IsNull || value.Value.Length == 0) return value;

        string trimmedValue = value.Trim();
        return new SqlString(trimmedValue);
    }
于 2013-01-07T14:44:15.000 に答える