TSQL Удаление вкладки и перевода строки из значений xml

Я пытаюсь выбрать значение из поля столбца 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 помогут, но пока не повезло.

Примечание. Я хочу заменить символы только в начале и в конце строки.


person Mark    schedule 07.01.2013    source источник


Ответы (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

Исходный код для функций Trim

person rs.    schedule 07.01.2013

Вы можете попытаться создать функцию CLR, которая принимает строковое значение в качестве параметра.

Затем просто делайте с ним то, что хотите, в С# и возвращайте правильное обрезанное значение, например:

    [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);
    }
person Erik Dekker    schedule 07.01.2013
comment
Похоже, хорошее и чистое решение, к сожалению, мы не работаем с CLR (пока), так что это не решение для меня. - person Mark; 08.01.2013