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