Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Объясните, пожалуйста, данную ситуацию:
DECLARE @ntext nvarchar(4000)
SET @ntext = '1'+REPLICATE(nchar(9), 3999)
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)
SET @ntext = replace(@ntext, NCHAR(9), ' ')
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)
Как заменить последний 4000-ый символ?

Microsoft SQL Server 2000 - 8.00.2249 (Intel X86) May 1 2007 18:39:59 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
1 дек 11, 16:23    [11690738]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а что конкретно непонятно?

> Как заменить последний 4000-ый символ?

replace все вхождения заменяет.
чтоб заменить символы в конкретном месте строки есть stuff.

Posted via ActualForum NNTP Server 1.4

1 дек 11, 16:34    [11690836]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Возможно вопрос не совсем понятен если не видеть результаты
У меня выдает:
LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=4000
DATALENGTH=8000
CHARINDEX=4000
То, есть
daw
replace все вхождения заменяет.
, но я вижу что это не так.
1 дек 11, 17:42    [11691417]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
PRINT CAST(ASCII(SUBSTRING(@ntext,3999,1)) as varchar)
PRINT CAST(ASCII(SUBSTRING(@ntext,4000,1)) as varchar)
PRINT CAST(ASCII(SUBSTRING(@ntext,3999,1)) as varchar)
PRINT CAST(ASCII(SUBSTRING(@ntext,4000,1)) as varchar)
1 дек 11, 17:47    [11691456]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Ошибся в предыдущем сообщении:
PRINT CAST(ASCII(SUBSTRING(@ntext,3999,1)) as varchar)
PRINT CAST(ASCII(SUBSTRING(@ntext,4000,1)) as varchar)
32
9
1 дек 11, 17:48    [11691463]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
Glory
Member

Откуда:
Сообщений: 104751
ambarka_max
, но я вижу что это не так.

Потому что смотреть надо вооруженным глазом
select cast(@ntext as varbinary(8000)), cast(replace(@ntext, NCHAR(9), ' ') as varbinary(8000))
1 дек 11, 17:52    [11691489]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
до
0x090009000900090009000900090009000900090009000900090009000900090009000900090009000900
после
0x200020002000200020002000200020002000200020002000200020002000200020002000200020000900
1 дек 11, 18:02    [11691573]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
а sql_variant_property(@ntext, 'Collation') что скажет?

что-то вертится у меня в голове, был в 2000-ом какой-то похожий баг, но сейчас не могу найти.

на
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) Apr 22 2011 11:57:00 Copyright (c) Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

для Cyrillic_General_CI_AS

видим ожидаемое:
LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=1
DATALENGTH=8000
CHARINDEX=0
1 дек 11, 20:50    [11692498]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
PRINT 'USE tempdb'
GO
USE tempdb
exec sp_dbcmptlevel 'tempdb'

DECLARE @ntext nvarchar(4000)
SET @ntext = '1'+REPLICATE(nchar(9), 3999)
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)

SET @ntext = replace(@ntext, NCHAR(9), ' ')
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)
PRINT '3999=' + CAST(ASCII(SUBSTRING(@ntext,3999,1)) as varchar)
PRINT '4000=' + CAST(ASCII(SUBSTRING(@ntext,4000,1)) as varchar)

SELECT sql_variant_property(@ntext, 'Collation')
GO
SELECT @@version

USE tempdb
The current compatibility level is 80.
LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=4000
DATALENGTH=8000
CHARINDEX=4000
3999=32
4000=9

----------------------------------------------------------------------
Cyrillic_General_CI_AS

(1 row(s) affected)


-----------------------------------------------------------------------
Microsoft SQL Server  2000 - 8.00.2055 (Intel X86) 
	Dec 16 2008 19:46:53 
	Copyright (c) 1988-2003 Microsoft Corporation
	Developer Edition on Windows NT 5.0 (Build 2195: Service Pack 4)


(1 row(s) affected)


Это только у меня такие смешные шрифты??
2 дек 11, 06:55    [11693391]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
USE tempdb
The current compatibility level is 80.
LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=4000
DATALENGTH=8000
CHARINDEX=4000
3999=32
4000=9
Cyrillic_General_CI_AS
Microsoft SQL Server  2000 - 8.00.2055 (Intel X86) 
Dec 16 2008 19:46:53 
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
2 дек 11, 08:20    [11693482]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Остается как то так:

USE tempdb
exec sp_dbcmptlevel 'tempdb'

DECLARE @ntext nvarchar(4000)
SET @ntext = '1'+REPLICATE(nchar(9), 3999)
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)

SET @ntext = REPLACE(@ntext, nchar(9), ' ') -- Автоматная очередь по несчастным
WHILE CHARINDEX(nchar(9),@ntext) > 0 -- Если есть живые
	SET @ntext = STUFF(@ntext,CHARINDEX(nchar(9),@ntext),1,' ') -- Контрольный в голову, да , а что делать, приказ есть приказ.
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)
PRINT '3999=' + CAST(ASCII(SUBSTRING(@ntext,3999,1)) as varchar)
PRINT '4000=' + CAST(ASCII(SUBSTRING(@ntext,4000,1)) as varchar)

SELECT sql_variant_property(@ntext, 'Collation')
GO
SELECT @@version

The current compatibility level is 80.
LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=1
DATALENGTH=8000
CHARINDEX=0
3999=32
4000=32

__
Cyrillic_General_CI_AS
__
Microsoft SQL Server 2000 - 8.00.2040 (Intel X86)
May 13 2005 18:33:17
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
2 дек 11, 09:09    [11693617]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Кстати еще есть идея может REPLACE -у подсовывать бинарные данные.
2 дек 11, 09:12    [11693627]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar(4000) и REPLACE  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
DECLARE @ntext nvarchar(4000)
SET @ntext = N'1'+REPLICATE(nchar(9), 3999)
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)
SET @ntext = replace( >>>cast(@ntext as varchar(8000)), CHAR(9), ' ')<<<
PRINT 'LEN=' + CAST(LEN(@ntext) as varchar)
PRINT 'DATALENGTH=' + CAST(DATALENGTH(@ntext) as varchar)
PRINT 'CHARINDEX=' + CAST(CHARINDEX(nchar(9),@ntext) as varchar)

LEN=4000
DATALENGTH=8000
CHARINDEX=2
LEN=1
DATALENGTH=8000
CHARINDEX=0

но не факт, что это позволено делать
2 дек 11, 13:54    [11696013]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить