2010-06-24 7 views
6

tüm varchar ve nvarchar alanları arasında newlines (\ r \ n) ve diğer tarayıcılar, HTML formlarını metin alanları ile gönderirken Unix stili yeni satırlar (\ n) oluşturur. Şimdi tüm Windows stili yeni satırları (\ r \ n), Unix stili yeni satırlara (\ n), SQL-Server veritabanımdaki varchar ve nvarchar alanlarına dönüştürmem gerekiyor.dönüştürmek için nasıl yeni satırlar (replace r n n) Ben IE, Windows tarzı oluşturur dikkate almadı nerede inşa edilmiş bir sistemde bir hata sonrası iyileşme am bir veritabanında

T-SQL tüm tabloları/satırları arasında yineleme ve varchar ve nvarchar alanları için '\ n' ile '\ r \ n' örneklerini değiştirmek için bir yolu var mı?

DÜZENLEME: yerine bölüm zor kısmı tüm varchar ve nvarchar alanları arasında bu yapıyor

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

gibi bir şey olacağını düşünüyorum.

cevap

9

böyle bir şey? Daha sonra bu dizeleri dinamik olarak çalıştırabilir veya sadece sonuçları kesip yapıştırabilir ve bir sorgu penceresinde çalıştırabilirsiniz.

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

Harika bir fikir, yaratıcılığı ve kısalığı severim. Teşekkür ederim. Not: Ben "in sc.name ('my_schema-1', 'my_schema_2', ...)" Kendi şemalar için kısıtlamak için formun alt tarafındaki bir koşul ekledi. Ayrıca bir sorgu penceresinde sonuçların yapıştırılmasına ve çalıştırılmasına izin vermek için ilk satırdaki dizenin sonuna noktalı virgül ekledim. –

1

Sen INFORMATION_SCHEMA sistem görünümleri yineleme ve bunu yapmak için dinamik SQL çalıştırabilir. İlgili görünüm INFORMATION_SCHEMA.COLUMNS olmalıdır.

Daha iyi bir yaklaşım bu değerleri görüntülemek için sahip olduğunda onunla UI anlaşma olması muhtemelen. Gelecekte DB'ye girme gibi değerleri önlemek için bir yönteminiz var mı? Büyük tablolar varsa

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 

, bu çalıştırmak için uzun bir zaman alabilir:

İşte başlamanıza gereken bazı örnek kod var. Ayrıca, optimal olarak her tabloyu yalnızca bir kez güncellersiniz; bu, tablodaki her bir dize sütunu için bir kez güncelleyecektir. Eğer bunu büyük bir veritabanında yapıyor olsaydım, o zaman bunu hesaplamak için betiği değiştirirdim - imlecinizi tablo şeması ve tablo adıyla sipariş et, tablodaki her sütun için dizenin SET kısmına ekle, sadece EXEC (@ cmd) tablo değiştiğinde ve SET dizginizi sıfırladığında.

+0

Evet, Form gönderilmesini \ n \ r \ n yerine istemci kodunu modifiye ettik ... ama yine şu ana kadar üretilmiş olan veritabanındaki tüm metin ile kaldım. –

+0

+1 - örnek T-SQL kodu için teşekkürler. –

İlgili konular