télécharger - Comment identifier le texte Unicode en SQL?




télécharger sql server management studio 2012 (2)

Vous n'avez pas répondu à ce que vous voulez au cas où il y aurait des caractères unicode et des caractères ascii dans la même chaîne, donc je vous donne 1 idée et 1 solution pour le cas si vous voulez seulement trouver des lignes "anglaises" ou "mixtes".

Vous avez besoin d'une table de nombres naturels pour le faire. Si vous n'avez pas une telle table, vous pouvez le générer comme ceci:

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); 

Maintenant que vous avez une table de nombres naturels, nous allons décomposer vos chaînes en caractères simples pour vérifier 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 première partie du code vous montre votre caractère chaîne par caractère avec le code ASCII ande ASCII du personnage: où ils sont les mêmes, c'est le caractère ASCII.

La deuxième partie vérifie juste si tous les caractères sont ascii.

Table1 a une colonne nvarchar appelée umsg qui contient du texte unicode et un peu de temps en anglais aussi.

Je veux trouver le texte anglais présent dans la colonne umsg.

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

J'ai utilisé ci-dessus requête que le travail bien dans la langue régionale, mais un certain temps échouent. Supposons que col contiennent du texte comme 'ref no été' Je pense que le message ci-dessus est unicode, si j'ai utilisé la requête ci-dessus, il / sql me montre en anglais non unicode.Comment gérer cela.

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é

Ci-dessus, les données sont présentes dans ma table. Mais je veux des données / sortie comme:

    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

vérifier ci-dessous:

;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;

Sortie désirée :

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      

J'espère, cela vous aidera.





sql-server-2012