Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
Добрый день,

Этот комвертор Unicode to Ansi работает если COLLATION базы данный Latin1_General_BIN.
Подскажите пожалуйста как сделать что бы он работал так же для базы где COLLATION установлен Cyrillic_General_CI_AI

CREATE FUNCTION [dbo].[convANSI]
(
	@string NVARCHAR(100)
)
RETURNS VARCHAR(100)
AS
BEGIN
	DECLARE @i       INT 
	DECLARE @c       CHAR 
	DECLARE @s       NVARCHAR
	DECLARE @start   INT  
	DECLARE @return  VARCHAR(100)
	
	IF @string IS NULL
		RETURN NULL

	SET @start = 1
	SET @return = ''

	WHILE (@start <= LEN(@string))
	BEGIN
	    SET @s = SUBSTRING(@string, @start, 1)
	    
	     
	    IF  NOT(UNICODE(@s) BETWEEN 1329 AND 1366) AND NOT(UNICODE(@s) BETWEEN 1377 AND 1415)
	    BEGIN	
			IF (UNICODE( @s ) = 1415)
			BEGIN
				SET @start = @start + 1
				SET @return =  @return + CHAR(168)
				CONTINUE
			END		
			SET @start = @start + 1
	        SET @return = @return + @s
    		CONTINUE
	    END	    
	    
	    IF UNICODE(@s) BETWEEN 1329 AND 1366
	    BEGIN
	    	SET @i = UNICODE(@s) - 1329
	    	SET @c = CHAR(2 * @i + 178)
	    END
	    ELSE
	    BEGIN
	    	SET @i = UNICODE(@s) - 1377
	    	SET @c = CHAR(2 * @i + 179)
	    END

	    SET @return = @return + @c
	    SET @start = @start + 1
	END 
	RETURN @return
END
22 авг 13, 11:02    [14740102]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Glory
Member

Откуда:
Сообщений: 104751
DECLARE @return NVARCHAR(100)
22 авг 13, 11:06    [14740119]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
Glory,

Неработает
22 авг 13, 11:20    [14740195]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Glory
Member

Откуда:
Сообщений: 104751
Eduard Minasyan
Неработает

Очень информативно
22 авг 13, 11:22    [14740209]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Glory
Member

Откуда:
Сообщений: 104751
RETURNS NVARCHAR(100) тоже надеюсь исправили ?
22 авг 13, 11:23    [14740215]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
Glory
RETURNS NVARCHAR(100) тоже надеюсь исправили ?


Конечно а так же в месо CHAR - NCHAR(2 * @i + 179)
22 авг 13, 11:28    [14740250]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Glory
Member

Откуда:
Сообщений: 104751
Объясните, что такое ваше "работал так же для базы где COLLATION установлен Cyrillic_General_CI_AI" ?
22 авг 13, 11:29    [14740263]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
Сработало спасибо
22 авг 13, 11:33    [14740298]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
Glory
Объясните, что такое ваше "работал так же для базы где COLLATION установлен Cyrillic_General_CI_AI" ?


В базе данных где default collation установлен в Latin1_General_BIN а в базе где установлен Cyrillic_General_CI_AI функция
выдает белиберду.
В этом виде уже работает

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[convANSI]
(
	@string NVARCHAR(100)
)
RETURNS NVARCHAR(100)
AS
BEGIN
	DECLARE @i       INT 
	DECLARE @c       NCHAR 
	DECLARE @s       NVARCHAR
	DECLARE @start   INT  
	DECLARE @return  NVARCHAR(100)
	
	IF @string IS NULL
		RETURN NULL

	SET @start = 1
	SET @return = ''

	WHILE (@start <= LEN(@string))
	BEGIN
	    SET @s = SUBSTRING(@string, @start, 1)
	    
	     
	    IF  NOT(UNICODE(@s) BETWEEN 1329 AND 1366) AND NOT(UNICODE(@s) BETWEEN 1377 AND 1415)
	    BEGIN	
			IF (UNICODE( @s ) = 1415)
			BEGIN
				SET @start = @start + 1
				SET @return =  @return + NCHAR(168) COLLATE Latin1_General_BIN
				CONTINUE
			END		
			SET @start = @start + 1
	        SET @return = @return + @s
    		CONTINUE
	    END	    
	    
	    IF UNICODE(@s) BETWEEN 1329 AND 1366
	    BEGIN
	    	SET @i = UNICODE(@s) - 1329
	    	SET @c = NCHAR(2 * @i + 178) COLLATE Latin1_General_BIN
	    END
	    ELSE
	    BEGIN
	    	SET @i = UNICODE(@s) - 1377
	    	SET @c = NCHAR(2 * @i + 179) COLLATE Latin1_General_BIN
	    END

	    SET @return = @return + @c
	    SET @start = @start + 1
	END 
	RETURN @return
END
22 авг 13, 11:38    [14740346]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
o-o
Guest
Eduard Minasyan

В базе данных где default collation установлен в Latin1_General_BIN а в базе где установлен Cyrillic_General_CI_AI функция
выдает белиберду.


как раз с точностью до наоборот:

К сообщению приложен файл. Размер - 13Kb
22 авг 13, 11:53    [14740504]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
Eduard Minasyan
Member

Откуда:
Сообщений: 119
o-o,

Это потому что у вас текст на русском а у меня на армянском.
22 авг 13, 14:21    [14741810]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
o-o
Guest
Eduard Minasyan,

до меня дошло уже.
покажите вашу таблицу ASCII(ссылку дайте),
коллэйшена армянского не существует,
с юникодом уже все нашлось.
потому что Ваше COLLATE Latin1_General_BIN не должно ничего менять
SET @c = NCHAR(2 * @i + 178) COLLATE Latin1_General_BIN

NCHAR уже юникод, ему коллэйшн побоку

К сообщению приложен файл. Размер - 9Kb
22 авг 13, 15:17    [14742315]     Ответить | Цитировать Сообщить модератору
 Re: Convert Unicode to ANSI  [new]
o-o
Guest
в общем, как перекодируете, до меня дошло,
вроде вот так проще будет:
create function dbo.convANSI2 (@s nvarchar(100))

returns nvarchar(100)
as
begin
	declare @ret nvarchar(100);
	with num as
	(
	select number n
	from master..spt_values
	where type = 'P' and number between 1 and LEN(@s)
	),

	tmp as(
	select n,    
		   case when UNICODE(SUBSTRING(@s, n, 1)) BETWEEN 1329 AND 1366 then NCHAR(2 * (UNICODE(SUBSTRING(@s, n, 1)) - 1329) + 178)
				when UNICODE(SUBSTRING(@s, n, 1)) BETWEEN 1377 AND 1415 then NCHAR(2 * (UNICODE(SUBSTRING(@s, n, 1)) - 1377) + 179)
				when UNICODE(SUBSTRING(@s, n, 1)) = 1415 then NCHAR(168)
				else SUBSTRING(@s, n, 1)
		   end  as u_char                         
	from num)

	select @ret = (select u_char from tmp order by n for xml path(''), type).value('.', 'nvarchar(100)');
	return @ret;
end


ну и вот картинка с результатом в кириллической базе.
тут:
dbo.convANSI -- исходная процедура,
dbo.convANSI1 -- Ваша поправленная,
dbo.convANSI2 -- моя

но, если честно, в след. раз показывайте желаемый результат, а то вот лично для меня
аутпуты всех трех функций -- белиберда :)

К сообщению приложен файл. Размер - 8Kb
22 авг 13, 17:15    [14743309]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить