【问题标题】:T SQL Remove ASCII character from SELECTT SQL 从 SELECT 中删除 ASCII 字符
【发布时间】: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 无济于事。

谢谢。

【问题讨论】:

标签: sql sql-server tsql openquery notin


【解决方案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。
  • 意思是说,任何扩展字符集都将被删除。
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2021-09-11
  • 2010-10-11
相关资源
最近更新 更多