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 回答