হোয়াইটস্পেস ট্রিম (স্পেস, ট্যাব, নিউলাইনস)


10

আমি এসকিউএল সার্ভার ২০১৪ এ আছি এবং আমার একটি কলামের সামগ্রীর শুরু এবং শেষ থেকে সাদা স্থান পরিষ্কার করা দরকার, যেখানে শ্বেত স্পেসটি সহজ জায়গা, ট্যাব বা নিউলাইন (উভয় \nএবং \r\n) হতে পারে ; যেমন

'    this content    '                          should become 'this content'
'  \r\n   \t\t\t this \r\n content \t  \r\n   ' should become 'this \r\n content'

ইত্যাদি।

আমি কেবল প্রথম ক্ষেত্রেটি অর্জন করতে সক্ষম হয়েছি

UPDATE table t SET t.column = LTRIM(RTRIM(t.column))

তবে অন্যান্য ক্ষেত্রে এটি কাজ করে না।

উত্তর:


8

এসকিউএল সার্ভার 2017 বা নতুনতর যে কেউ ব্যবহার করছেন For

আপনি ট্রিমটি অন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

DECLARE @Test NVARCHAR(4000);
SET @Test = N'  
    ' + NCHAR(0x09) + N'  ' + NCHAR(0x09) + N' this 
 ' + NCHAR(0x09) + NCHAR(0x09) + N'  content' + NCHAR(0x09) + NCHAR(0x09) + N'  
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N'     ';

SELECT N'~'
        + TRIM(NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A) FROM @Test)
        + N'~';

দয়া করে মনে রাখবেন এর ডিফল্ট আচরণটি TRIMকেবলমাত্র ফাঁকা স্থান সরিয়ে ফেলা হয়, তাই ট্যাবগুলি এবং নিউলাইনগুলি (সিআর + এলএফ) অপসারণ করার জন্য আপনাকে এই characters FROMধারাটি নির্দিষ্ট করতে হবে ।

এছাড়াও আমি ভেরিয়েবলের NCHAR(0x09)ট্যাব অক্ষরগুলির জন্য ব্যবহার করেছি @Testযাতে উদাহরণ কোডটি অনুলিপি করা যায় এবং সঠিক অক্ষরগুলি ধরে রাখা যায়। অন্যথায়, এই পৃষ্ঠাটি যখন রেন্ডার করা হয় তখন ট্যাবগুলি স্পেসে রূপান্তরিত হয়।

এসকিউএল সার্ভার 2016 বা তার বেশি বয়সী যে কারও জন্য

আপনি কোনও এসকিউএলসিআরআর স্কেলার ইউডিএফ বা একটি টি-এসকিউএল ইনলাইন টিভিএফ (আইটিভিএফ) হিসাবে একটি ফাংশন তৈরি করতে পারেন। টি-এসকিউএল ইনলাইন টিভিএফ নিম্নরূপ হবে:

CREATE
--ALTER
FUNCTION dbo.TrimChars(@OriginalString NVARCHAR(4000), @CharsToTrim NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
WITH cte AS
(
  SELECT PATINDEX(N'%[^' + @CharsToTrim + N']%', @OriginalString) AS [FirstChar],
         PATINDEX(N'%[^' + @CharsToTrim + N']%', REVERSE(@OriginalString)) AS [LastChar],
        LEN(@OriginalString + N'~') - 1 AS [ActualLength]
)
SELECT cte.[ActualLength],
       [FirstChar],
       ((cte.[ActualLength] - [LastChar]) + 1) AS [LastChar],
       SUBSTRING(@OriginalString, [FirstChar],
                 ((cte.[ActualLength] - [LastChar]) - [FirstChar] + 2)) AS [FixedString]
FROM   cte;
GO

এবং এটি নিম্নলিখিত হিসাবে চলমান:

DECLARE @Test NVARCHAR(4000);
SET @Test = N'  
    ' + NCHAR(0x09) + N'  ' + NCHAR(0x09) + N' this 
 ' + NCHAR(0x09) + NCHAR(0x09) + N'  content' + NCHAR(0x09) + NCHAR(0x09) + N'  
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N'     ';

SELECT N'~' + tc.[FixedString] + N'~' AS [proof]
FROM   dbo.TrimChars(@Test, NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) tc;

রিটার্নস:

proof
----
~this 
              content~

এবং যদি আপনি একটি ব্যবহার করতে পারেন যে UPDATEব্যবহার CROSS APPLY:

UPDATE tbl
SET    tbl.[Column] = itvf.[FixedString]
FROM   SchemaName.TableName tbl
CROSS APPLY  dbo.TrimChars(tbl.[Column],
                           NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) itvf

শুরুতে উল্লিখিত হিসাবে, এটি এসকিউএলসিআরআর মাধ্যমেও সত্যই সহজ কারণ নেট। র মধ্যে এমন একটি Trim()পদ্ধতি অন্তর্ভুক্ত রয়েছে যা আপনি যা চান তা ঠিক পরিচালনা করে। হয় আপনি কল করতে নিজের কোড SqlString.Value.Trim()করতে পারেন, বা আপনি এসকিউএল # লাইব্রেরির ফ্রি সংস্করণ ইনস্টল করতে পারেন (যা আমি তৈরি করেছি তবে এই ফাংশনটি ফ্রি সংস্করণে রয়েছে) এবং স্ট্রিং_ট্রিম (যা কেবল সাদা স্থান করে) বা স্ট্রিং_ট্রিচার ব্যবহার করতে পারেন যেখানে আপনি উভয় পক্ষ থেকে ছাঁটাতে অক্ষরগুলিতে পাস করুন (উপরে দেখানো আইটিভিএফের মতো)।

DECLARE @Test NVARCHAR(4000);
SET @Test = N'  
    ' + NCHAR(0x09) + N'  ' + NCHAR(0x09) + N' this 
 ' + NCHAR(0x09) + NCHAR(0x09) + N'  content' + NCHAR(0x09) + NCHAR(0x09) + N'  
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N'     ';

SELECT N'~' + SQL#.String_Trim(@Test) + N'~' AS [proof];

এবং এটি আইটিএফএফ উদাহরণ আউটপুটে উপরে প্রদর্শিত ঠিক একই স্ট্রিংটি প্রদান করে। তবে স্কেলার ইউডিএফ হওয়ায় আপনি এটিতে নিম্নলিখিত হিসাবে এটি ব্যবহার করবেন UPDATE:

UPDATE tbl
SET    tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM   SchemaName.TableName tbl

উপরের যে কোনও একটি লক্ষ লক্ষ সারি জুড়ে ব্যবহারের জন্য দক্ষ হওয়া উচিত। মাল্টি-স্টেটমেন্ট টিভিএফ এবং টি-এসকিউএল স্কেলার ইউডিএফগুলির বিপরীতে ইনলাইন টিভিএফগুলি অপ্টিমাইজযোগ্য। এবং, এসকিউএলসিআরআর স্কেলার ইউডিএফগুলির মধ্যে সমান্তরাল পরিকল্পনাগুলি ব্যবহার করার সম্ভাবনা রয়েছে, যতক্ষণ না তারা চিহ্নিত করা IsDeterministic=trueহয় এবং যেকোন প্রকারের Readডেটা অ্যাক্সেস সেট না করে (ব্যবহারকারী এবং সিস্টেম ডেটা অ্যাক্সেস উভয়ের জন্য ডিফল্ট None), এবং উভয় শর্তগুলি উপরে উল্লিখিত এসকিউএলসিআরআর উভয় কার্যক্রমে সত্য।


4

আপনার ডেটা শুরু এবং শেষ থেকে আপত্তিকর চরিত্রগুলি অপসারণ করতে আপনি একটি টিভিএফ (টেবিল-মূল্যযুক্ত ফাংশন) ব্যবহার করে বিবেচনা করতে চাইতে পারেন।

পরীক্ষার ডেটা ধরে রাখতে একটি সারণী তৈরি করুন:

IF COALESCE(OBJECT_ID('dbo.TrimTest'), 0) <> 0
BEGIN
    DROP TABLE dbo.TrimTest;
END
CREATE TABLE dbo.TrimTest
(
    SampleData VARCHAR(50) NOT NULL
);

INSERT INTO dbo.TrimTest (SampleData)
SELECT CHAR(13) + CHAR(10) + CHAR(9) + 'this is ' + CHAR(13) + CHAR(10) + ' a test' + CHAR(13) + CHAR(10);
GO

টিভিএফ তৈরি করুন:

IF COALESCE(OBJECT_ID('dbo.StripCrLfTab'), 0) <> 0
BEGIN
    DROP FUNCTION dbo.StripCrLfTab;
END
GO
CREATE FUNCTION dbo.StripCrLfTab
(
    @val NVARCHAR(1000)
)
RETURNS @Results TABLE
(
    TrimmedVal NVARCHAR(1000) NULL
)
AS
BEGIN
    DECLARE @TrimmedVal NVARCHAR(1000);
    SET @TrimmedVal = CASE WHEN RIGHT(@val, 1) = CHAR(13) OR RIGHT(@val, 1) = CHAR(10) OR RIGHT(@val, 1) = CHAR(9)
            THEN LEFT(
                CASE WHEN LEFT(@val, 1) = CHAR(13) OR LEFT(@val, 1) = CHAR(10) OR LEFT(@val, 1) = CHAR(9)
                THEN RIGHT(@val, LEN(@val) - 1)
                ELSE @val
                END
                , LEN(@val) -1 )
            ELSE
                CASE WHEN LEFT(@val, 1) = CHAR(13) OR LEFT(@val, 1) = CHAR(10) OR LEFT(@val, 1) = CHAR(9)
                THEN RIGHT(@val, LEN(@val) - 1)
                ELSE @val
                END
            END;
    IF @TrimmedVal LIKE (CHAR(13) + '%')
        OR @TrimmedVal LIKE (CHAR(10) + '%')
        OR @TrimmedVal LIKE (CHAR(9) + '%')
        OR @TrimmedVal LIKE ('%' + CHAR(13))
        OR @TrimmedVal LIKE ('%' + CHAR(10))
        OR @TrimmedVal LIKE ('%' + CHAR(9))
        SELECT @TrimmedVal = tv.TrimmedVal
        FROM dbo.StripCrLfTab(@TrimmedVal) tv;
    INSERT INTO @Results (TrimmedVal)
    VALUES (@TrimmedVal);
    RETURN;
END;
GO

ফলাফলগুলি দেখানোর জন্য টিভিএফ চালান:

SELECT tt.SampleData
    , stt.TrimmedVal
FROM dbo.TrimTest tt
CROSS APPLY dbo.StripCrLfTab(tt.SampleData) stt;

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

ফাংশনে প্রবেশ করা স্ট্রিংয়ের শুরু এবং শেষের দিকে কোনও আপত্তিজনক অক্ষর না পাওয়া পর্যন্ত টিভিএফ নিজেকে পুনরাবৃত্তভাবে ডাকে। এটি একটি বৃহত সংখ্যক সারিগুলির উপর ভাল সঞ্চালনের সম্ভাবনা নেই, তবে সম্ভবত আপনি যদি এটি ডাটাবেসে সন্নিবেশ করানো হয় তাই ডেটা ঠিক করতে এটি ব্যবহার করছেন ok

আপনি এটি একটি আপডেট বিবৃতিতে ব্যবহার করতে পারেন:

UPDATE dbo.TrimTest
SET TrimTest.SampleData = stt.TrimmedVal
FROM dbo.TrimTest tt
CROSS APPLY dbo.StripCrLfTab(tt.SampleData) stt;


SELECT *
FROM dbo.TrimTest;

ফলাফল (পাঠ্য হিসাবে):

এখানে চিত্র বর্ণনা লিখুন


আপনাকে ম্যাক্স ধন্যবাদ, দুর্ভাগ্যক্রমে আমাকে একাধিক টেবিলগুলিতে একটি বৃহত পরিমাণে সারি (মিলিয়ন) পরিষ্কার করতে হবে, আমি আশা করেছি যে কোনও ফাংশনটি / / এর UPDATEমতো একটি ক্যোয়ারিতে ব্যবহার করা হবে , যাতে কোনও ক্রিয়াকলাপ ছাঁটাই করতে অক্ষরের একটি তালিকা গ্রহণ করে with অনেক স্ক্রিপ্টিং ভাষা আছে। LTRIMRTRIMUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))TRIM( expression, charlist )
জিওভান্নি লোভাটো

আমি এটি সম্পর্কে "যে" সতর্কতা দিয়েছি তা "সম্ভবত" প্রচুর সারিতে ভাল কাজ না করা সমস্যা হতে পারে বা নাও হতে পারে। আপনি যদি এটি একবার করে করেন তবে সমস্যা নাও হতে পারে। আপনি এটি উত্পাদনহীন পরিবেশে পরীক্ষা করতে চাইতে পারেন যাতে এটি দেখতে কত সময় লাগে।
ম্যাক্স ভার্নন

আপনি কীভাবে কোনও updateবিবৃতিতে এটি ব্যবহার করবেন তা দেখানোর জন্য আমি আমার উত্তর আপডেট করব ।
ম্যাক্স ভার্নন

1

আমার এই নির্দিষ্ট পরিস্থিতি নিয়ে সবেমাত্র একটি সমস্যা ছিল, আমার প্রতিটি ক্ষেত্র সাদা স্থান সহ সন্ধান করা এবং পরিষ্কার করা দরকার, তবে আমি আমার ডাটাবেস ক্ষেত্রগুলিতে 4 ধরণের সম্ভাব্য সাদা স্থান পেয়েছি (এএসসিআইআই কোড সারণীর রেফারেন্স):

  • অনুভূমিক ট্যাব (চার (9))
  • নতুন লাইন (চর (10))
  • উল্লম্ব ট্যাব (চার (9))
  • স্পেস (গৃহস্থালির কাজ (32))

হয়তো এই ক্যোয়ারী আপনাকে সহায়তা করতে পারে।

UPDATE @TABLE SET @COLUMN = replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')

এটি ক্ষেত্রের মাঝামাঝি থেকেও সাদা অংশকে পরিষ্কার করে, কেবল সূচনা এবং শেষের হিসাবে নয় প্রশ্নটিতে জিজ্ঞাসা করা হয়েছে।
কলিন 'হার্ট

হ্যাঁ, আপনি ঠিক বলেছেন, আমি সম্পাদনা করব
sami.almasagedi

-1

আপনাকে দ্বিতীয় উদাহরণটি বিশ্লেষণ করতে হবে কারণ এলটিআরআইএম / আরটিআরআইএম কেবল ফাঁকা স্থান ছাঁটাই করে। এসকিউএল ডেটা (/ r, / t, ইত্যাদি) বিবেচনা করে আপনি আসলে ট্রিম করতে চান। আপনি যে মানগুলি সন্ধান করছেন তা যদি জানেন তবে তাদের প্রতিস্থাপনের জন্য কেবল প্রতিস্থাপন ব্যবহার করুন। আরও ভাল, একটি ফাংশন লিখুন এবং কল করুন।


-1

আপনি যদি চান, আমার মার্জিত ফাংশন ব্যবহার করুন:

CREATE FUNCTION s_Trim
(
    @s nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
    -- Create comparators for LIKE operator
    DECLARE @whitespaces nvarchar(50) = CONCAT('[ ', CHAR(9), CHAR(10), CHAR(13), ']'); -- Concat chars that you consider as whitespaces
    DECLARE @leftComparator nvarchar(50) = @whitespaces + '%',
            @rightComparator nvarchar(50) = '%' + @whitespaces;
    -- LTRIM
    WHILE @s LIKE @leftComparator AND LEN(@s + 'x') > 1 SET @s = RIGHT(@s, LEN(@s + 'x') - 2)
    -- RTRIM
    WHILE @s LIKE @rightComparator AND LEN(@s + 'x') > 1 SET @s = LEFT(@s, LEN(@s + 'x') - 2)

    RETURN @s;
END
GO

1
স্কেলারের মূল্যবান ফাংশন খুব কমই মার্জিত হয়। তারা ক্যারিগুলিকে ক্রমিকভাবে চালিত করতে বাধ্য করে এবং প্রতি সারিতে একবার সম্পাদন করে (একবারে ক্যোয়ারি নয়)। পরিবর্তে আপনার ইনলাইন টেবিলের মূল্যবান ফাংশনগুলি দেখতে হবে।
এরিক ডার্লিং

-2

বড় ডেটাতে ফাংশন ব্যবহার করতে দীর্ঘ কার্যকরকরণের সময় লাগতে পারে। আমার কাছে 8 মিলিয়ন সারিগুলির একটি ডেটাসেট রয়েছে, ব্যবহারের কাজটি কার্যকর করতে 30 মিনিটেরও বেশি সময় লেগেছিল। replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')মাত্র 5 সেকেন্ড সময় নিয়েছে। সবাইকে ধন্যবাদ. আমি আপনাকে @ সামি.আলম্যাসেদী এবং @ কলিনের হার্ট দেখতে পাচ্ছি


আপনি যে উত্তরটি পুনরাবৃত্তি করছেন ঠিক তেমন, যদি প্রথম এবং শেষ অবধি সাদা বর্ণের অক্ষরের মধ্যে শ্বেত স্পেস বজায় রাখা হয় তবে এটি সমস্যার সমাধান করবে না। গতিটি কেবল তখনই কার্যকর যখন এটি পছন্দসই উত্তরের ফলাফল দেয়। এছাড়াও - ফাংশনগুলি যাতে এই জাতীয় কোনও কোয়েরি কমিয়ে না দেয় তা নিশ্চিত করার জন্য স্বীকৃত উত্তরে নোটগুলি দেখুন।
আরডিফোজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.