2017-02-20 10 views
1

У меня есть поле memo, которое может содержать & и эквивалент HTML &. Мне нужно написать сценарий, чтобы убедиться, что все экземпляры амперсанда являются эквивалентом HTML. У сценария ниже, но предложение WHERE, по-видимому, не учитывает отдельные экземпляры (строки) & в поле memo, просто поле в целом ... Любые идеи о том, как это сделать? Благодарю.SQL-строка заменить на основании предложения WHERE

UPDATE 
    STOCKMEM 
SET 
    INETFDESC = CAST(REPLACE(CAST(INETFDESC as NVarchar(MAX)),'&','&') AS NText) 
WHERE 
    INETFDESC LIKE '%&%' 
    AND INETFDESC NOT LIKE '%&%' 
+0

Что вы подразумеваете под * «' WHERE' положение, кажется, не учитывают отдельные экземпляры '&'»*? Можете ли вы показать некоторые данные образца? – Siyual

+0

Потому что есть сотни тысяч строк, и это поле memo, у которого есть только те строки, которые требуют обновления ... так что только экземпляры where & продолжаются с помощью «amp;» - Это помогает? – Justin

ответ

5

Попробуйте вместо этого:

UPDATE STOCKMEM 
SET INETFDESC = CAST(
         REPLACE(
           REPLACE(
             CAST(INETFDESC as NVarchar(MAX)) 
           ,'&','&') 
         , '&', ,'&')AS NText) 
WHERE INETFDESC LIKE '%&[^amp;]%' 

Первый замены изменится & на &, а второй заменит все & обратно &.

BTW, Обратите внимание, что NText тип данных: depricated, и вы должны преобразовать его в nvarchar(max). От MSDN:

ВАЖНО!ntext, Текст, и изображения типы данных будут удалены в будущей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте изменять приложения, которые в настоящее время их используют. Использовать nvarchar (макс.), varchar (max) и varbinary (max).

+0

Отлично, спасибо, Зоар! С WHERE LIKE обрабатывать все экземпляры &, а не только тех, кто нуждается в обновлении, есть ли какая-либо эффективность, которую можно получить, регулируя это? Это поле memo содержит сотни тысяч строк. Спасибо. – Justin

+0

Да, где можно улучшить. Будет редактировать позже. –

+0

Спасибо, Zohar, с нетерпением ждем ваших отзывов. – Justin

2

Вы можете сделать то же самое с помощью этого:

UPDATE STOCKMEM 
SET INETFDESC = CONVERT(NVARCHAR(MAX),(REPLACE(REPLACE(INETFDESC, '&', '&'), '&', '&'))) 
WHERE INETFDESC LIKE '%&%'