T-SQL trim(和其他非字母数字字符)

jwo*_*ly2 7 sql sql-server

我们有一些输入数据有时会出现在最后的字符中.

数据作为varchar()从源系统进入,我们尝试转换为十进制失败b/c这些字符.

Ltrim和Rtrim不会删除字符,因此我们不得不这样做:

UPDATE myTable
SET myColumn = replace(myColumn,char(160),'')
WHERE charindex(char(160),myColumn) > 0
Run Code Online (Sandbox Code Playgroud)

这适用于 ,但对于任何非字母数字(或在本例中为数字)字符,是否有一种好方法可以执行此操作?

小智 17

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

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
Run Code Online (Sandbox Code Playgroud)

使用如下功能:

UPDATE TableToUpdate
SET ColumnToUpdate = dbo.fnRemoveBadCharacter(ColumnToUpdate)
WHERE whatever
Run Code Online (Sandbox Code Playgroud)


Esp*_*spo 9

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

-- 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 
Run Code Online (Sandbox Code Playgroud)