2010-07-26 9 views
5

У меня есть таблица с ошибочным символом (' ') в количестве строк в одном столбце.SQL Server 2008: заменить строку

Ниже приведен скрипт TSQL ниже.

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, '�', '...') 
FROM tblSacrifices S 

В рассматриваемой колонке имеется тип данных nvarchar (230) и разрешены нулевые записи.

Данные получены из файла csv, преобразованного из Excel и d через приложение Windows Visual Studio. Первоначально данные были «...», но я думаю, что слово/excel классифицировало это как один символ (а не 3 отдельных «.»). Когда мое приложение прочитало исходную строку из файла CSV, она (случайно) заменила «...» на « » перед отправкой данных в базу данных.

Пожалуйста, помогите

+0

Что тип данные пораженных колонок? –

+0

Hi Ed это nvarchar (230).Также в столбце разрешены значения null (если это имеет значение). – Chris

+5

Вы абсолютно уверены, что символом в данных является черный бриллиант с вопросительным знаком, а не то, что он просто отображается как таковой из-за проблемы с кодировкой? Или, возможно, являясь персонажем, который не отображается в шрифте, с которым вы его просматриваете? –

ответ

5

Обдумал это. Спасибо всем за вашу помощь.

Мне пришлось преобразовать в двоичный файл. Все символы юникода выше 65500 требуют этого, поскольку нормальная REPLACE() не работает.

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, nchar(65533) COLLATE Latin1_General_BIN, '...') 
FROM tblSacrifices S 
+0

Вы заменяете одного символа на три, чтобы результат мог быть длиннее. Можете ли вы не просто использовать одиночный символ elipsis 'N '...'' (В противном случае, я думаю, вам нужно будет сделать столбец более широким или использовать 'LEFT' для усечения себя или' SET ANSI_WARNINGS OFF', чтобы игнорировать ошибку и разрешить усечение. –

+0

Я вижу благодарность Мартина. Я просто расширил максимально допустимые символы для столбца, так как я не хотел потерять ни одну из данных. – Chris

1

Попробуйте быть четко указано, что символ, который вы ищете является NVARCHAR с помощью ведущего N:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, N'�', '...') 
FROM tblSacrifices S 

UPDATE на основе обсуждения с ответом Мартина:

У меня нет оснований думать, что это функционально отличается от того, что я написал выше, но вы могли бы попробовать:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(65533), '...') 
FROM tblSacrifices S 

UPDATE 2

Я не читал код Мартина достаточно близко перед обновлением моего ответа. Поскольку для отображения результатов используется функция SQL-сервера UNICODE, фактический символ ошибки маскируется на 65533.

См. here для получения подробной информации о символе unicode 65533 - это общее значение unicode для плохих данных.

+0

Спасибо Эд, но это тоже не сработает. Пожалуйста, см. Мой ответ Мартину в моем оригинальном посте. Дополнительная информация может помочь в ответе на вопрос. Еще раз спасибо – Chris

+0

+1 для Update2. Любая идея, если есть альтернативный способ? –

+0

Спасибо вам обоим. Как вы, наверное, уже знаете, что тоже не работает. Есть ли способ, возможно, удалить «плохие данные», а затем заменить, но тогда мы бы не стали knwo, куда его поместить. Я застрял! – Chris

1

Edit:

После обновления в комментариях пытаются REPLACE(S.Offering_Details, nchar(65533), '...')

Оригинал Ответ:

Это может помочь вам устранить его

declare @s nvarchar(230) 

SELECT @s= ProblemCol 
FROM YourTable 
WHERE ProblemRowId = X; 


set @s = N'日本国'; /*For testing*/ 


WITH N AS 
    (SELECT 1 idx, 
      LEFT(@s,1)ch, 
      UNICODE(LEFT(@s,1)) C 

    UNION ALL 

    SELECT idx+1, 
      SUBSTRING(@s,idx+1,1), 
      UNICODE(SUBSTRING(@s,idx+1,1)) C 
    FROM N 
    WHERE idx<LEN(@s) 
    ) 


    SELECT idx, ch,C 
    FROM  N  

Результат теста

idx   ch C 
----------- ---- ----------- 
1   日 26085 
2   本 26412 
3   国 22269 
+0

Кстати, «Результаты для текста» в студии управления, похоже, обрабатывают эти символы лучше, чем результаты в сетке - по крайней мере, с моей настройкой. –

+0

Спасибо Мартин, я поставил результаты в своем оригинальном посте. Они такие же, как твои. Я не уверен, что это значит. – Chris

+0

@Chris - Да, жаль, что я хотел, чтобы вы удалили эту строку 'set @s = N '日本国';/* Для тестирования */'это было просто дать демоверсию того, что она вернет. После того, как вы узнаете код (ы) проблемы, вы можете сделать Replace с помощью 'nchar (26085)' или что-то еще, если вы просто хотите избавиться от них. –

0

Используйте функцию Unicode, как это, возможно, поможет вам:

UPDATE S 
SET S.Offering_Details = REPLACE(S.Offering_Details, NCHAR(UNICODE('�')), '...') 
FROM tblSacrifices S where S.Offering_Details like '%�%'