T SQL 从 SELECT 中删除 ASCII 字符
Posted
技术标签:
【中文标题】T SQL 从 SELECT 中删除 ASCII 字符【英文标题】:T SQL Remove ASCII character from SELECT 【发布时间】:2019-12-17 13:45:45 【问题描述】:我使用的是 SQL Server 2014。
我有下面的 SQL 语句来查找不匹配的记录。但是,它现在可以正常工作,因为 OPENQUERY 中的字段“dsc”实际上在字符串值之前包含一个水平制表符(ASCII 字符 009):
SELECT [E_Code]
FROM [Person] P
WHERE P.E_Code NOT IN (
SELECT dsc
FROM OPENQUERY(svr01, 'select "dsc" from TST.eth')
)
如何从 dsc 字段中删除 ASCII 字符 009?我尝试过 LTRIM 无济于事。
谢谢。
【问题讨论】:
你可以使用子字符串。 这能回答你的问题吗? How do I remove extended ASCII characters from a string in T-SQL? @xXx 对不起,没有。我创建了该函数并且可以看到它,但是当我尝试运行它时,我只收到:'RemoveNonASCII' 不是一个可识别的内置函数名称。 【参考方案1】:DECLARE @str VARCHAR(20) = CONCAT('This is a tab--> ', '<--');
SELECT @str, REPLACE(@str, CHAR(9), '');
SELECT [E_Code]
FROM [Person] P
WHERE P.E_Code NOT IN (
SELECT REPLACE(dsc, CHAR(9), '')
FROM OPENQUERY(svr01, 'select "dsc" from TST.eth')
)
【讨论】:
谢谢,但这对我原来的问题有什么帮助?【参考方案2】:更改最大递归并创建以下内容
Create Function dbo.ASCIICleaner(@inputstring nvarchar(max))
Returns nvarchar(max)
BEGIN
Declare @returnValue nvarchar(max) = '';
with lengths as
(
select @inputstring data, len(@inputstring) length,1 start
)
,recurv as
(
select data,length,UNICODE(substring(data,start,1)) chari ,start from lengths where start= 1
union all
select data,length,UNICODE(substring(data,start+1,1)),start+1 from recurv where length > start
)
select @returnValue+= char(chari)
from recurv
where chari between 32 and 127
order by start asc
return @returnValue
END
select dbo.ASCIICleaner('aËbËcËDËEËF')
abcDEF 将被返回
【讨论】:
对您的代码稍加解释会很有帮助 我承认它本来可以更简洁,通过使用递归 cte,您可以识别要排除的字符,在这种情况下,任何不是扩展字符集的字符,唯一的限制是最大值递归 cte 的大小为 32767。 意思是说,任何扩展字符集都将被删除。以上是关于T SQL 从 SELECT 中删除 ASCII 字符的主要内容,如果未能解决你的问题,请参考以下文章
T-SQL语言中数据定义语言、数据操纵语言中所包含的主要语句和功能
SQL Server - 删除所有不可打印的 ASCII 字符
SQL:从 SELECT 语句返回的所有条目中删除部分字符串