TSQL从xml值中删除选项卡和换行符

时间:2013-01-07 14:16:30

标签: sql sql-server-2008 tsql xquery-sql

我正在尝试使用以下查询从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可以做到这一点,但到目前为止没有运气。

注意:我只想替换字符串开头和结尾的字符

2 个答案:

答案 0 :(得分: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

Original Source for Trim functions

答案 1 :(得分: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);
    }