transact texto recorrer parte funciones formato extraer dar caracter cadena buscar sql sql-server sql-server-2012

texto - recorrer string sql server



¿Cómo identificar el texto Unicode en sql? (2)

Table1 tiene una columna nvarchar llamada umsg que contiene texto unicode y también inglés.

Quiero saber el texto en inglés presente en la columna umsg.

select * from table1 where RDate >=''01/01/2014'' and RDate < ''09/26/2017'' and umsg = convert(varchar(max), umsg)

Utilicé la consulta anterior que funciona bien en el idioma regional, pero falla un poco. Supongamos que col contiene texto como ''ref no à © tÃ''. Creo que el mensaje anterior es unicode, si utilicé la consulta anterior, it / sql me muestra como inglés no unicode. Cómo manejar esto.

Table : Id Date Umsg 1 2017-09-12 00:00:00.000 The livers detoxification processes. 2 2017-09-11 00:00:00.000 Purposely added 1 3 2017-09-10 00:00:00.000 फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से स्वयं को बचा सकते 4 2017-09-17 00:00:00.000 तनाव एक लाइलाज बीमारी कतई नहीं है। कुछ लोग तनाव को आसानी से झेल लेते ह 5 2017-09-17 00:00:00.000 ref no été

Arriba están los datos presentes en mi mesa. Pero quiero datos / resultados como:

Id Date Umsg 1 2017-09-12 00:00:00.000 The livers detoxification processes. 2 2017-09-11 00:00:00.000 Purposely added 1


No contestó lo que quiere en caso de que haya algunos caracteres Unicode y algunos Ascii en la misma cadena, por lo que le doy 1 idea y 1 solución para el caso si solo quiere encontrar filas "puros en inglés" o "mixtas".

Necesitas una tabla de números naturales para hacer esto. En caso de que no tengas una tabla de este tipo, puedes generarla así:

select top 1000000 row_number() over(order by getdate()) as n into dbo.nums from sys.messages m1 cross join sys.messages m2; alter table dbo.nums alter column n int not null; alter table dbo.nums add constraint PK_nums_n primary key(n);

Ahora que tienes una tabla de números naturales vamos a descomponer tus cadenas en caracteres individuales para verificar si ascii(character) = unicode(character) :

declare @t table(col Nvarchar(200)); insert into @t values (N''ref no été''), (N''The livers detoxification processes.''), (N''फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से'') select t.col, n, substring(t.col, n, 1) as nth_character, ascii(substring(t.col, n, 1)) as ascii, unicode(substring(t.col, n, 1)) as uni from @t t join dbo.nums n on n.n <= len(t.col); -- this is to give you an idea how to see if it''s unicode character or ascii with cte as ( select t.col, n, substring(t.col, n, 1) as nth_character, ascii(substring(t.col, n, 1)) as ascii, unicode(substring(t.col, n, 1)) as uni from @t t join dbo.nums n on n.n <= len(t.col) ) select col, case when sum(case when ascii = uni then 1 else 0 end) = count(*) then ''English only'' else ''Not only English'' end as eng_or_not from cte group by col -- row level solution

La primera parte del código muestra su cadena carácter por carácter junto con el código ascii ande unicode del personaje: donde son iguales es su carácter ascii.

La segunda parte solo verifica si todos los personajes son ascii.


verifique abajo:

;WITH CTE AS ( SELECT ID, DATE, umsg, CASE WHEN(CAST(umsg AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_Cp1251_CS_AS) = umsg THEN 0 ELSE 1 END HasSpecialChars FROM <table_name>) SELECT ID, DATE, umsg FROM CTE WHERE Date >= ''01/01/2014'' AND Date < ''09/26/2017'' AND HasSpecialChars = 0;

Salida deseada :

ID DATE umsg 1 2017-09-12 00:00:00.000 The livers detoxification processes. 2 2017-09-11 00:00:00.000 Purposely added 1

Espero que te ayude.