怎樣在SQL Server中去除表中不可見字符

  • 1607
  • 0

摘要:怎樣在SQL Server中去除表中不可見字符

以下的實例為去除指定表中數據類型是VARCHAR,CHAR,NVARCHAR的字段值中的不可見字符。註釋:此處只去掉前後的不可見字符,不包括中間的字符,而且沒有區分中文。

在使用前需要指定對應要修改的表名,並且需要在對應數據庫下執行;

SET NOCOUNT ON 
DECLARE @TblName VARCHAR(100) 
DECLARE @UpdateString NVARCHAR(1000) 
DECLARE @SelectString NVARCHAR(1000) 
DECLARE @COlName VARCHAR(100) 
DECLARE @COUNT INT 
SET @TblName = 'YOURTABLENAME'--指定想要修改的表名
--定義游標取出指定表內的數據類型是VARCHAR,char,nVARCHAR的字段名稱
DECLARE cur_ColName CURSOR 
FOR 
SELECT col.name 
FROM syscolumns AS col 
inner join sysobjects AS obj ON col.ID = obj.ID 
INNER join systypes AS typ ON col.xtype = typ.xtype 
WHERE obj.xtype ='U' 
AND obj.name = @TblName 
AND typ.name IN ('VARCHAR','CHAR','NVARCHAR','NCHAR') 
FOR READ ONLY 
--打開游標
OPEN cur_ColName 
FETCH NEXT FROM cur_ColName INTO @ColName 
IF @@FETCH_STATUS<>0 
BEGIN 
PRINT '沒有對應表或字段,
'PRINT '請確認當前數據庫內有' + @TblName + '表,
' PRINT '或該表內有VARCHAR、CHAR、NVARCHAR、NCHAR類型的字段!
' GOTO LABCLOSE 
END--循環修改
WHILE @@FETCH_STATUS=0 
BEGIN 
--拼修改字符串
--去掉左邊的不可見字符(空白 32, 問號(?) 63)
SET @SelectString = 'SELECT @COU=COUNT(*)     
FROM ' + @TblName +'    
WHERE ASCII(LEFT(' + @ColName +',1))<63  
AND '+ @ColName + ' IS NOT NULL' 
EXEC sp_executesql @SelectString,N'@COU INT OUTPUT', 
@COUNT OUTPUT WHILE @COUNT>0 
BEGIN  
SET @UpdateString =   
' UPDATE ' + @TblName +   
' SET ' + @ColName + '=RIGHT(' + @ColName + ',LEN(' + @ColName + ')-1)    
WHERE ASCII(LEFT(' + @ColName + ',1))<63    
AND ' + @ColName + ' IS NOT NULL'  
EXEC sp_executesql @UpdateString  
EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT 
END 
--去掉右邊的不可見字符
SET @SelectString = 'SELECT @COU=COUNT(*)     
FROM ' + @TblName +'    
WHERE ASCII(RIGHT(' + @ColName +',1))<63    
AND '+ @ColName + ' IS NOT NULL' 
EXEC sp_executesql @SelectString,N'@COU INT OUTPUT', 
@COUNT OUTPUT WHILE @COUNT>0 
BEGIN  
SET @UpdateString = ' UPDATE ' + @TblName + ' SET ' 
+ @ColName + '=LEFT(' + @ColName + ',LEN( ' + @ColName + ')-1)    
WHERE ASCII(RIGHT(' + @ColName + ',1))<63    
AND ' + @ColName + ' IS NOT NULL'  
EXEC SP_EXECUTESQL @UpdateString  
EXEC sp_executesql @SelectString,N'@ COU INT OUTPUT', 
@COUNT OUTPUT 
END 
PRINT 'column: ' + @ColName + '---ok'
FETCH NEXT FROM cur_ColName INTO @ColName 
END 
--關閉、釋放游標
LABCLOSE: CLOSE cur_ColName  
DEALLOCATE cur_ColName