Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
имеется функция (найденная в интернете):
create function dbo.FN_remove_tags (@a varchar(max))
returns varchar(max)
as
begin
	
declare @start int
declare @end int
declare @length int

	set @start = charindex('<',@a)
	set @end = charindex('>',@a,charindex('<',@a))
	set @length = (@end - @start) + 1
	
	while @start > 0 and @end > 0 and @length > 0
	begin
		set @a = stuff(@a,@start,@length,'')
		set @start = charindex('<',@a)
		set @end = charindex('>',@a,charindex('<',@a))
		set @length = (@end - @start) + 1
	end

return @a

end


на входе подается nvarchar(max).
все отлично отрабатывает.
но если в функции сменить тип параметра и возвращаемой строки на nvarchar(max),
зависает.
в чем может быть дело?
6 фев 12, 16:03    [12041649]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
в чем может быть дело?

В бесконечном цикле while ?
6 фев 12, 16:05    [12041679]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,

а как может цикл, бывший конечным, стать вдруг бесконечным?
строка на входе та же самая,
условия цикла: если есть закрывающее > после открывающего <.
если это все находилось в строке до смены типа параметра,
куда оно может деваться после?
6 фев 12, 16:12    [12041762]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
а как может цикл, бывший конечным, стать вдруг бесконечным?
строка на входе та же самая,

А вы строки меряете чем - символами или байтами ?
6 фев 12, 16:13    [12041786]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,

да хоть чем.
входная строка всегда юникодная.
на выходе хотелось бы тоже, но зацикливается
6 фев 12, 16:17    [12041834]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
входная строка всегда юникодная.

Это извините, как вы в varchar храните юникод ?
6 фев 12, 16:19    [12041866]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,
я и не храню в varchar.
в таблице как раз nvarchar(max).
и то, что в таблице, надо от тэгов очистить.
функция это и делает,
но ответ отдает уже varchar.
а надо чтоб и на выходе был nvarchar.
но стоит поменять параметр функции и выход на nvarchar, как зависает
6 фев 12, 16:23    [12041931]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
create function dbo.FN_remove_tags (@a varchar(max))
returns varchar(max)

Сообщение было отредактировано: 6 фев 12, 16:24
6 фев 12, 16:24    [12041945]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
но стоит поменять параметр функции и выход на nvarchar, как зависает

И что мешает вам отследить, что происходит при вызове вашей функции то ?
6 фев 12, 16:26    [12041965]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,
ну так и я про это.
мне на выходе не нужен varchar(max).
заменяю на nvarchar(max).
и заодно входной параметр тоже заменяю на nvarchar(max).
и зависает
6 фев 12, 16:27    [12041981]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory
fff_fff
но стоит поменять параметр функции и выход на nvarchar, как зависает

И что мешает вам отследить, что происходит при вызове вашей функции то ?

размер мешат.
строка в 690 000 символов.
кто ж его знает, в каком месте зависает
6 фев 12, 16:29    [12042019]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
размер мешат.
строка в 690 000 символов.
кто ж его знает, в каком месте зависает

Мда
А взять для теста строку меньшего размера совесть не позволяет ?
А повторяющиеся куски кода в Профайлере на версию о зацикливании не натолкнут ?
6 фев 12, 16:31    [12042049]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,

так на простеньких коротких строках отрабатывает!
а на которой зависает, та именно что огроменный HTML-документ с таблицами.
знать бы в каком месте зависает, конечно можно было б тот кусок вырезать и тестировать...
6 фев 12, 16:36    [12042105]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
а на которой зависает, та именно что огроменный HTML-документ с таблицами.
знать бы в каком месте зависает, конечно можно было б тот кусок вырезать и тестировать...

И что мешает для отладки перенести код в процедуру с отладочными выводами то ?
6 фев 12, 16:39    [12042135]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Вложенные теги бывают?
6 фев 12, 16:40    [12042138]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
fff_fff,

у литералов "N" поставили?
6 фев 12, 16:41    [12042166]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
iap,

на вложенность сейчас проверю, но это надолго будет, таблица здоровая.
"N" не спасает абсолютно, все то же зависание.
да и в BOL они пишут:

CHARINDEX ( expression1 ,expression2 [ , start_location ] ) 
...
If either expression1 or expression2 is of a Unicode data type (nvarchar or nchar) and the other is not, the other is converted to a Unicode data type.
т.е. как я понимаю, он уже "<" и ">" конвертил в юникод, раз входная строка юникод
6 фев 12, 16:58    [12042325]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
fff_fff,

неявное преобразование VARCHAR в NVARCHAR не всегда выпоняется корректно.
Даже от COLLATE зависит.
Кстати, а c COLLATEом что там у нас?

Если теги могут быть вложенными, то данная функция вообще будет работать неправильно.
Алгоритм с грубыми ошибками - находит первый '<' и удаляет всё вплоть до ближайшего следующего '>' включительно
Сколько при этом выбрасывается '<' - никому неизвестно.
Говнокод?

Правда, я не выполнял данную функцию. Это я так, чисто теоретически.
6 фев 12, 17:23    [12042514]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
iap,
collation SQL_Latin1_General_CP1_CI_AS.
на вложенность наверное будет до завтра проверять.

пусть даже функция выкидывает лишнее.
никак не пойму, почему может зацикливаться...
может половинным делением разбивать нехорошую строку и на половинах проверять?
но тогда наверняка пойдут незакрытые или неоткрытые теги в половинах...
а как еще-то найти, где циклится?
6 фев 12, 17:50    [12042757]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fff_fff
а как еще-то найти, где циклится?

Убивают такие вопросы
Ну поставить какую нибудь проверку в цикле на число итераций и прерывай его принудительно
Потом сравни полученный результат с оригиналом.
6 фев 12, 17:55    [12042801]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
select @@version?
6 фев 12, 18:00    [12042868]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Glory,

спасибо.
сейчас так и сделаю.

а может, вообще можно как-то обойтись без выбрасывания тегов?
пользоваеть желает отчет Reporting Services,
где фигурирует этот несчастный столбец.
в него накопированы HTML-и,
размеры бывают внушительные.
отчет не сохраняется в Excel,
вылетает с ошибкой превышения 32000 с копейками символов в строке.
ок, разбиваю строку на куски по 32000 символов (inline function+cross apply),
но приходится же сперва теги выкидывать,
иначе вся HTML-разбивка летит при делении на куски.
тоже ведь говнорешение (хотя проканывает, если допустить вывод varchar)
можно ли как-то по-другому решить?

на выходе надо иметь текст, не превышающий 32000 символов в строке,
или HTML, или просто текст
6 фев 12, 18:03    [12042893]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
Crimean
select @@version?

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) (Hypervisor)
6 фев 12, 18:05    [12042901]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
fff_fff
Guest
еще (может это важно?): у базы выставлен Compatibility Level 90,
а сам столбец ntext,
но я его конвертирую в nvarchar(max)
6 фев 12, 18:11    [12042945]     Ответить | Цитировать Сообщить модератору
 Re: функция с varchar(max) отрабатывает, с nvarchar(max) висит. в чем проблема?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ну, я бы функцию как-то так переделал:

	while 1=1
	begin
		declare @start int
		set @start = charindex('<',@a)
		if @start = 0 break

		declare @end int
		set @end = charindex('>',@a,@start)
		if @end = 0 break

		declare @length int
		set @length = (@end - @start) + 1
		set @a = stuff(@a,@start,@length,'')
	end


+ к этому добавить контроль зацикливания и к примеру на 1000 итерации прерывать и тупо возвращать null, что будет сигналом, что зациклились
6 фев 12, 18:49    [12043124]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить