T-SQL修剪&nbsp(和其他非字母数字字符)

时间:2020-03-05 18:50:10  来源:igfitidea点击:

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

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

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

UPDATE myTable
SET myColumn = replace(myColumn,char(160),'')
WHERE charindex(char(160),myColumn) > 0

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

解决方案

回答

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

-- 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)中之前对其进行清理。这是一个选择吗?

回答

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

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

使用如下功能:

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