powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чувствительность к регистру (функция replace)
22 сообщений из 22, страница 1 из 1
Чувствительность к регистру (функция replace)
    #32082484
Проблема в том, что в поле name таблицы закачаны строки, содержащие некоторые(не все) символы в неправильной кодировке в верхнем и нижнем регистре. можно поменять их функцией replace. В результате меняет символы и в нижнем и в верхнем регистрах. Как сделать замену регистрочувствительной?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #32082487
Trong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще всего, наверное, свою функцию написать ...
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #32082562
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для 7, пожалуй примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
set nocount on
declare @s varchar( 20 ),
@b varbinary( 20 ), 
@b11 binary( 1 ), @b12 binary( 1 ),
@b21 binary( 1 ), @b22 binary( 1 )

set @s='AAAaaaCCCccc'
set @b=convert(varbinary( 20 ),@s)

set @b11=convert(varbinary( 1 ),'a')
set @b12=convert(varbinary( 1 ),'b')

set @b21=convert(varbinary( 1 ),'c')
set @b22=convert(varbinary( 1 ),'d')

declare @i int 
set @i= 1 

while @i<=len(@s)
begin
select  @b= 
	case when substring(@b,@i, 1 )=@b11 
		then convert(varbinary( 20 ),stuff(@b,@i, 1 ,@b12)) else 
	case when substring(@b,@i, 1 )=@b21 
		then convert(varbinary( 20 ),stuff(@b,@i, 1 ,@b22)) else 
	@b end end

set @i=@i+ 1 
end

set @s=convert(varchar( 20 ),@b)

select @s
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #32082572
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REPLACE чувствительна к регистру.
При условии, что аргумент (поле name) имеет case-sensitive collation.
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #32082681
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если версия сервера 2000, то можно воспользоваться COLLATE, например (коллейшн базы по умолчанию - Latin1_General_CI_AS):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @field nvarchar( 100 ), @what nvarchar( 100 ), @to nvarchar( 100 )

Set @field='A StRiNg'
Set @what='string'
Set @to='XXXXXX'

Select
	replace(@field,@what,@to),
	replace(@field collate Latin1_General_CS_AS,@what collate Latin1_General_CS_AS,@to)
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #32082695
Fil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fil
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @up varchar( 80 )
set @up='ASerTYUhjk'

select upper(@up)

set @up='ASerTYUhjk'

select lower(@up)


результат:

1.ASERTYUHJK

2.asertyuhjk
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Чувствительность к регистру (функция replace)
    #39845441
Cat2, здравствуйте!

Тоже возникла такая задача, но на MS SQL Server 2017. Ваш скрипт подойдёт? Или может там уже придумали регистрочувствительные функции подмены?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845443
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунCat2, здравствуйте!

Тоже возникла такая задача, но на MS SQL Server 2017. Ваш скрипт подойдёт? Или может там уже придумали регистрочувствительные функции подмены?
Чем вам вариант с collate не нравится?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845448
Minamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')


почему-то возвращает ?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845457
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунMinamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')



почему-то возвращает ?1. Cat2 здесь вряд ли появится.
2. У вас юникод (nvarchar)?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845472
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунMinamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')


почему-то возвращает ?

Потому что (как правильно выше написал iap)

Код: sql
1.
select replace(N'h' collate Latin1_General_CS_AS, N'h' collate Latin1_General_CS_AS, N'н')
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845669
Minamoto и iap, спасибо. Приставка N указывает программе, что на входе nvarchar?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845678
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунMinamoto и iap, спасибо. Приставка N указывает программе, что на входе nvarchar? FAQ
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845702
iap, спасибо. Получается с помощью N мы задаем default collation и одновременно допиской collate Latin1_General_CS_AS устанавливаем еще один collation. Зачем, кто из них побудит? :)
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845703
*победит
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845708
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркунiap, спасибо. Получается с помощью N мы задаем default collation и одновременно допиской collate Latin1_General_CS_AS устанавливаем еще один collation. Зачем, кто из них побудит? :)При чём здесь collation?
Если пишем литеральную строку, то встаёт вопрос: а какого она типа?
Чтобы избежать преобразование по умолчанию, когда имеем в виду юникодную строку,
пишем перед ней букву N, и сервер в момент чтения этой строки знает, что это - юникод.
Преобразование по умолчанию происходит не всегда корректно.
Символы юникода в MSSQL двухбайтные в отличие от строк ASCII.
Два байта на символ и один байт на символ - есть разница?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845710
iap, спасибо. А дописка collate Latin1_General_CS_AS для чего?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845718
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркунiap, спасибо. А дописка collate Latin1_General_CS_AS для чего?
Чтобы указать параметры сравнения строк, а конкретно - Case Sensitive (CS в названии).
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39845757
Minamoto, спасибо!
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39849633
Здравствуйте!

Попробовал применить совет на практике:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, Np.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


Возвращает ошибку вида "Не удалось привязать составной идентификатор "Np.C_Name1""
Если же N с пробелом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
	d.C_name
	, p.C_Name1
	, replace(N p.C_Name1 collate Latin1_General_CS_AS, N p.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S	-- ЛС
		ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
		ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


то ошибка "Неправильный синтаксис около конструкции "p"."
Скажите, пожалуйста, как правильно применить ссылку на юникод(N)?
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39849652
Guf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,

Код: sql
1.
	, replace(p.C_Name1 collate Latin1_General_CS_AS, p.C_Name1 collate Latin1_General_CS_AS, N'н')


"N" нужен только у строковых констант, во всех остальных случаях он не нужен.
Одна из красных единиц, видимо, лишняя
...
Рейтинг: 0 / 0
Чувствительность к регистру (функция replace)
    #39849653
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис ГаркунЗдравствуйте!

Попробовал применить совет на практике:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, Np.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


Возвращает ошибку вида "Не удалось привязать составной идентификатор "Np.C_Name1""
Если же N с пробелом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
	d.C_name
	, p.C_Name1
	, replace(N p.C_Name1 collate Latin1_General_CS_AS, N p.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S	-- ЛС
		ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
		ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


то ошибка "Неправильный синтаксис около конструкции "p"."
Скажите, пожалуйста, как правильно применить ссылку на юникод(N)?N - это для строчных литералов.

Для приведения поля к юникоду надо использовать CAST или CONVERT:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, CAST(p.C_Name1 as nvarchar(max)) collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чувствительность к регистру (функция replace)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]