Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql ltrim(rtrim(x))在rtl内容上留空-有人知道如何解决这个问题吗?_Tsql_Sql Server 2008 - Fatal编程技术网

Tsql ltrim(rtrim(x))在rtl内容上留空-有人知道如何解决这个问题吗?

Tsql ltrim(rtrim(x))在rtl内容上留空-有人知道如何解决这个问题吗?,tsql,sql-server-2008,Tsql,Sql Server 2008,我有一个表[Company],其列[Address3]定义为varchar(50) 我无法控制输入到该表中的值,但我需要提取不带前导和尾随空格的值。我执行以下查询: SELECT DISTINCT RTRIM(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3 SELECT DISTINCT ltrim(rTRIM(ltrim(rTRIM([Address3])))) c, ltrim(rTRIM([Address3]))

我有一个表[Company],其列[Address3]定义为varchar(50) 我无法控制输入到该表中的值,但我需要提取不带前导和尾随空格的值。我执行以下查询:

SELECT DISTINCT RTRIM(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3
SELECT DISTINCT ltrim(rTRIM(ltrim(rTRIM([Address3])))) c, ltrim(rTRIM([Address3])) b, [Address3] a, rtrim(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3
该列包含rtl和ltr值 大部分检索到的数据都被正确检索到了,但是一些(不是全部)RTL值返回时带有前导和/或尾随空格

我尝试执行以下查询:

SELECT DISTINCT RTRIM(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3
SELECT DISTINCT ltrim(rTRIM(ltrim(rTRIM([Address3])))) c, ltrim(rTRIM([Address3])) b, [Address3] a, rtrim(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3

但是它在所有列上都返回了相同的问题-有人知道是什么导致了它吗?

返回的行中有多余的空格,可能有一种修剪函数不知道的空格或不可见字符。甚至没有提到什么被认为是“空白”(如果你问我的话,那真是太草率了)。试着从这些行中选取一行,逐个查看字符,看看它们是什么字符。

因为您使用的是varchar,所以只需这样做就可以获得所有坏字符的ascii码

--identify the bad character
SELECT 
    COUNT(*) AS CountOf
        ,'>'+RIGHT(LTRIM(RTRIM(Address3)),1)+'<' AS LastChar_Display
        ,ASCII(RIGHT(LTRIM(RTRIM(Address3)),1))  AS LastChar_ASCII
    FROM Company 
    GROUP BY RIGHT(LTRIM(RTRIM(Address3)),1)
    ORDER BY 3 ASC
如果您的数据中有伪造字符,请从数据中删除它们,而不是每次选择数据时。您必须将此替换逻辑添加到此列上的所有插入和更新,以防止任何新数据具有伪造字符

如果无法更改数据,可以通过以下方式选择:

SELECT
    LTRIM(RTRIM(REPLACE(Address3,CHAR(xxxx),'')))
    ,LTRIM(RTRIM(REPLACE(REPLACE(Address3,CHAR(xxxx1),''),char(xxxx2),'')))
...

空格之间可能有
RTL
LTR
标记-因此修剪停止在它们处。你是对的-我使用以下方法将文本转换为十六进制:选择DISTINCT master.dbo.fn_varbintohextstr(cast(ltrim(rtrim([Address3])作为varbinary))e,master dbo.fn_varbintohextr(cast([Address3]作为varbinary))在我的查询开始时,我发现里面有0x0d0a,thanksi在解决方案中使用了替换,并在应用ltrim之前替换了有问题的字符(rtrim combo我无法修复数据,因为我无法控制数据如何输入到表中-因此,即使我修复数据,相同的字符仍将每隔一段时间出现一次-相反,我最好在飞行中的选择中修复它。你永远不会
最好在飞行中的选择中修复它在每次运行select之前,我需要一次更新和一个触发器来保持数据的纯净。您希望反复修复相同的数据多少次,每次都浪费资源,永远?问题是数据不是我的-它属于由该独立应用程序维护的独立应用程序,我无法修复它因为这些字符可能是合法的,所以我可以正确修复它们的唯一方法是添加一个计算列或添加一个单独的表,并在原始表上执行任何插入/更新/删除操作,使其保持最新。这两个选项我都不喜欢