关于sql server:T-SQL trim&nbsp(和其他非字母数字字符)

关于sql server:T-SQL trim&nbsp(和其他非字母数字字符)

T-SQL trim   (and other non-alphanumeric characters)

我们有一些输入数据,有时有时以&nbsp字符结尾。

数据以varchar()的形式从源系统输入,而我们尝试将这些字符强制转换为十进制会失败。

Ltrim和Rtrim不会删除字符,因此我们被迫执行以下操作:

1
2
3
UPDATE myTable
SET myColumn = REPLACE(myColumn,CHAR(160),'')
WHERE charindex(CHAR(160),myColumn) > 0

这适用于&nbsp,但是对于任何非字母数字(在这种情况下为数字)字符,有没有很好的方法呢?


这将删除所有非字母数字字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE FUNCTION [dbo].[fnRemoveBadCharacter]
(
    @BadString nvarchar(20)
)
RETURNS nvarchar(20)
AS
BEGIN

            DECLARE @nPos INTEGER
            SELECT @nPos = PATINDEX('%[^a-zA-Z0-9_]%', @BadString)

            WHILE @nPos > 0
            BEGIN
                        SELECT @BadString = STUFF(@BadString, @nPos, 1, '')
                        SELECT @nPos = PATINDEX('%[^a-zA-Z0-9_]%', @BadString)
            END

            RETURN @BadString
END

使用类似的功能:

1
2
3
UPDATE TableToUpdate
SET ColumnToUpdate = dbo.fnRemoveBadCharacter(ColumnToUpdate)
WHERE whatever


此页面提供了有关如何删除非字母数字字符的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
-- Put something like this into a user function:
DECLARE @cString    VARCHAR(32)
DECLARE @nPos    INTEGER
SELECT  @cString = '90$%45623 *6%}~:@'
SELECT  @nPos = PATINDEX('%[^0-9]%', @cString)

WHILE @nPos > 0
BEGIN
SELECT @cString = STUFF(@cString, @nPos, 1, '')
SELECT  @nPos = PATINDEX('%[^0-9]%', @cString)
END

SELECT @cString

表格如何填充? 虽然可以在sql中进行清理,但更好的方法是将列类型更改为int并在将数据加载到数据库(SSIS)中之前对其进行清理。 这是一个选择吗?


如果手机可以以Plus(+)开头,我将使用如下功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE FUNCTION [dbo].[Mobile_NoAlpha](@Mobile VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @StartsWithPlus BIT = 0

    --check if the mobile starts with a plus(+)
    IF LEFT(@Mobile, 1) = '+'
    BEGIN
        SET @StartsWithPlus = 1

        --Take out the plus before using the regex to eliminate invalid characters
        SET @Mobile = RIGHT(@Mobile, LEN(@Mobile)-1)
    END

    WHILE PatIndex('%[^0-9]%', @Mobile) > 0
        SET @Mobile = Stuff(@Mobile, PatIndex('%[^0-9]%', @Mobile), 1, '')  

    IF @StartsWithPlus = 1
        SET @Mobile = '+' + @Mobile
    RETURN @Mobile
END

对于大型数据集,我最好使用此功能来检查ASCII值。 我添加了一些选项,以根据参数仅保留字母,数字或字母数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--CleanType 1 - Remove all non alpanumeric
--          2 - Remove only alpha
--          3 - Remove only numeric
CREATE FUNCTION [dbo].[fnCleanString] (
        @InputString    VARCHAR(8000)
    ,   @CleanType      INT
    ,   @LeaveSpaces    bit
)   RETURNS VARCHAR(8000)
AS
BEGIN

    -- // Declare variables
    -- ===========================================================
    DECLARE @LENGTH     INT
        ,   @CurLength  INT = 1
        ,   @ReturnString VARCHAR(8000)=''

    SELECT @LENGTH = len(@InputString)

    -- // Begin looping through each char checking ASCII value
    -- ===========================================================
    WHILE (@CurLength <= (@LENGTH+1))
    BEGIN
        IF  (ASCII(SUBSTRING(@InputString,@CurLength,1)) BETWEEN 48 AND 57      AND @CleanType IN (1,3) )
        OR  (ASCII(SUBSTRING(@InputString,@CurLength,1))    BETWEEN 65 AND 90   AND @CleanType IN (1,2) )
        OR  (ASCII(SUBSTRING(@InputString,@CurLength,1))    BETWEEN 97 AND 122  AND @CleanType IN (1,2) )
        OR  (ASCII(SUBSTRING(@InputString,@CurLength,1))    = 32    AND @LeaveSpaces = 1 )
        BEGIN
            SET @ReturnString = @ReturnString + SUBSTRING(@InputString,@CurLength,1)
        END
        SET @CurLength = @CurLength + 1
    END

    RETURN  @ReturnString
END


推荐阅读

    linux系统中剪切命令?

    linux系统中剪切命令?,工作,系统,地址,信息,命令,目录,管理,标准,工具,文件,L

    linux文件输入命令?

    linux文件输入命令?,工作,系统,地址,信息,工具,位置,命令,设备,发行,首开,lin

    linux系统ll命令?

    linux系统ll命令?,信息,系统,数据,时间,文件,命令,权限,观察,第一,数字,用ll

    linux命令行系统录屏?

    linux命令行系统录屏?,工具,地方,系统,工作,地址,命令,服务,环境,状态,目录,

    终止linux系统的命令?

    终止linux系统的命令?,系统,传播,命令,电脑,软件,工作,管理,情况,进程,指令,l

    linux命令行不能输入?

    linux命令行不能输入?,工作,系统,电脑,服务,命令,名字,首次,百度,管理,第一,l

    linux中命令如何输入?

    linux中命令如何输入?,系统,电脑,地址,工具,发行,命令,终端,密码,名字,网站,l

    linux系统光盘命令?

    linux系统光盘命令?,系统,工作,信息,数据,地址,命令,一致,名称,盘中,传播,如

    linux拼接字符串命令?

    linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,l

    linux系统反回命令?

    linux系统反回命令?,密码,系统,终端,环境,名称,状态,信息,电脑,一致,命令,lin

    命令查看linux系统?

    命令查看linux系统?,系统,信息,第一,设备,名称,软件,状态,工具,电脑,命令,如

    linux系统ln命令?

    linux系统ln命令?,位置,信息,系统,名称,名字,发行,盘中,文件,链接,命令,如何

    linux系统命令pwd?

    linux系统命令pwd?,密码,系统,命令,目录,工作,环境,工具,位置,不了,路径,锁定

    linux系统使用命令?

    linux系统使用命令?,系统,工作,管理,信息,基础,命令,地址,一致,目录,操作,lin

    linux图形转字符命令?

    linux图形转字符命令?,系统,电脑,密码,界面,情况,地方,工具,图形界面,字符,

    linux系统as命令?

    linux系统as命令?,系统,信息,管理,设备,软件,地址,命令,工具,服务,基础,Linux

    linux存储数据命令?

    linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Lin

    linux系统下一页命令?

    linux系统下一页命令?,系统,工作,地址,信息,命令,情况,下来,目录,功能,文件,

    linux系统命令装软件?

    linux系统命令装软件?,软件,系统,官网,名称,管理,信息,工具,命令,初学者,阿

    linux系统监视器命令?

    linux系统监视器命令?,系统,情况,工具,信息,实时,电脑,平均,报告,管理,分析,