我正在尝试使用以下查询从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可以做到这一点,但到目前为止没有运气。
注意:我只想替换字符串开头和结尾的字符
答案 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
答案 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);
}