sql تحميل - كيفية تحديد نص ونيكود في سكل؟




microsoft server (3)

لم تجيب على ما تريد في حالة وجود بعض أحرف ونيكود وبعض أحرف أسي في نفس السلسلة، لذلك أعطيك 1 فكرة و 1 حل لهذه الحالة إذا كنت تريد فقط العثور على "الإنجليزية نقية" أو "مختلطة" الصفوف.

كنت في حاجة الى جدول من الأرقام الطبيعية للقيام بذلك .في حال لم يكن لديك مثل هذا الجدول يمكنك توليد مثل هذا:

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

الآن أن لديك جدول من الأرقام الطبيعية ونحن في طريقنا لتحليل السلاسل الخاصة بك في أحرف واحدة للتحقق مما إذا 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

الجزء الأول من التعليمات البرمجية يظهر لك حرف السلسلة الخاصة بك حسب الحرف جنبا إلى جنب مع حرف أسي و رمز ونيكود حرف: حيث هم نفس حرف أسي.

الجزء الثاني فقط تحقق إذا كانت جميع الشخصيات أسي.

Table1 لديه عمود نفارتشار يسمى أومسغ الذي يحتوي على نص ونيكود وبعض الوقت الإنجليزية أيضا.

أريد أن أعرف النص الإنجليزي الموجود في عمود أومسغ.

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

استخدمت الاستعلام أعلاه التي تعمل بشكل جيد في اللغة الإقليمية ولكن بعض الوقت تفشل. لنفترض أن كول تحتوي على نص مثل 'ريف نو à © tà ©' أعتقد أن الرسالة أعلاه هي ونيكود، إذا كنت تستخدم الاستعلام أعلاه، فإنه / سكل يظهر لي الإنجليزية لا ونيكود. كيفية التعامل مع هذا.

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é

أعلاه البيانات موجودة في الجدول الخاص بي. ولكن أريد البيانات / الإخراج مثل:

    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

راجع أدناه:

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

النتيجة المرجوة :

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      

أتمنى أنها تساعدك.


استعلام تحديث مبسط باستخدام JOIN -ينج جداول متعددة.

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

ملاحظة - first_table و second_table و third_table و some_column مثل 123456 هي أسماء الجداول التجريبية وأسماء الأعمدة والمعرفات. استبدالها بأسماء صالحة.





sql sql-server sql-server-2012