2010-06-24 4 views
6

IE가 Windows 스타일을 생성한다는 것을 고려하지 않은 곳에 구축 한 시스템에서 버그를 복구하고 있습니다. newlines (\ r \ n) 및 다른 브라우저는 텍스트 영역이있는 HTML 양식을 게시 할 때 Unix 스타일의 줄 바꿈 (\ n)을 생성합니다. 이제 SQL-Server 데이터베이스의 varchar 및 nvarchar 필드에서 모든 Windows 스타일의 줄 바꿈 (\ r \ n)을 Unix 스타일의 줄 바꿈 (\ n)으로 변환해야합니다.데이터베이스의 모든 varchar 및 nvarchar 필드에서 줄 바꾸기 ( r n을 n으로 바꾸기)

T-SQL의 모든 테이블/행을 반복하고 varchar 및 nvarchar 필드에 대해 '\ r \ n'의 인스턴스를 '\ n'으로 바꾸는 방법이 있습니까?

편집 : 나는 대체 부품이 어려운 부분은 모두 VARCHAR 및 NVARCHAR 필드를 통해이 일을한다

REPLACE(@fieldContents, CHAR(13)+CHAR(10), CHAR(10)) 

같은 될 것이라고 생각합니다.

답변

9

이와 비슷한? 그런 다음 이러한 문자열을 동적으로 실행하거나 결과를 잘라내어 붙여넣고 쿼리 창에서 실행할 수 있습니다.

select 'update ' + sc.name + '.' + t.name + ' set ' + c.name + ' = replace(' + c.name + ', CHAR(13)+CHAR(10), CHAR(10))' 
from sys.columns c 
    inner join sys.systypes st 
     on c.system_type_id = st.xtype 
      and CHARINDEX('varchar', st.name) <> 0 
    inner join sys.tables t 
     on c.object_id = t.object_id 
    inner join sys.schemas sc 
     on t.schema_id = sc.schema_id 
+0

굉장한 아이디어, 나는 창의력과 간결함을 좋아합니다. 고맙습니다. 참고 : "my.schema-1 ','my_schema_2 ', ...)의 sc.name 위치를 양식의 맨 아래에 추가하여 내 스키마로 제한했습니다. 또한 첫 번째 줄의 문자열 끝에 세미콜론을 추가하여 쿼리 창에서 결과를 붙여 넣을 수있었습니다. –

1

INFORMATION_SCHEMA의 시스템보기를 반복하고 동적 SQL을 실행하여 수행 할 수 있습니다. 관련보기는 INFORMATION_SCHEMA.COLUMNS 여야합니다.

더 나은 접근 방법은 값을 표시해야 할 때 UI를 처리하는 것입니다. 나중에 DB에 값이 들어 가지 않도록하는 방법이 있습니까? 당신이 큰 테이블이있는 경우

DECLARE 
    @table_schema SYSNAME, 
    @table_name SYSNAME, 
    @column_name SYSNAME, 
    @cmd   VARCHAR(MAX) 

DECLARE cur_string_columns AS 
    SELECT 
     TABLE_SCHEMA, 
     TABLE_NAME, 
     COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.COLUMNS 
    WHERE 
     DATA_TYPE IN ('VARCHAR', 'CHAR') AND -- NVARCHAR and NCHAR? 
     CHARACTER_MAXIMUM_LENGTH > 1 

OPEN cur_string_columns 

FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @cmd = 'UPDATE 
    ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' 
SET ' + QUOTENAME(@column_name) + ' = REPLACE(' + QUOTENAME(@column_name) + ', CHAR(13) + CHAR(10), CHAR(10))' 

    EXEC(@cmd) 

    FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name 
END 

CLOSE cur_string_columns 

DEALLOCATE cur_string_columns 

이 실행하는 데 시간이 오래 걸릴 수 있습니다 :

다음은 시작하는 할 몇 가지 샘플 코드입니다. 또한 최적으로 테이블의 각 문자열 열에 대해 한 번 업데이트하는 동안 각 테이블을 한 번만 업데이트합니다. 대형 데이터베이스에서이 작업을 수행했다면 커서를 테이블 스키마 및 테이블 이름으로 정렬하고 테이블의 각 열에 대한 문자열의 SET 부분을 추가 한 다음 EXEC (@ cmd)를 사용하여 테이블을 변경 한 다음 SET 문자열을 다시 설정하십시오.

+0

예, 양식 제출에 \ n을 함께 \ r \ n을 대체 할 수있는 클라이언트 코드를 수정 한 ...하지만 난 여전히 지금까지 생성 된 데이터베이스의 모든 텍스트 왼쪽입니다. –

+0

+1 - 샘플 T-SQL 코드를 게시 해 주셔서 감사합니다. –