টিএসকিউএলে একটি নতুন লাইন প্রতিস্থাপন করুন


414

আমি টিএসকিউএল-স্ট্রিংয়ে একটি নতুন লাইন চরিত্রটি প্রতিস্থাপন করতে (বা অপসারণ) করতে চাই। কোন ধারনা?

সুস্পষ্ট

REPLACE(@string, CHAR(13), '')

শুধু এটা করবে না ...

উত্তর:


841

আসলে একটি এসকিউএল কমান্ড বা স্ক্রিপ্ট স্ট্রিংয়ের একটি নতুন লাইন সিআর, এলএফ বা সিআর + এলএফ যে কোনও হতে পারে। এগুলি সব পেতে আপনার এই জাতীয় কিছু দরকার:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

5
@ নীলস ব্রিঞ্চ এটি দীর্ঘক্ষণ কাজ করবে যতক্ষণ না এটি আপনার স্ট্রিংয়ের একমাত্র প্রকার লাইন ব্রেক break তবে এসকিউএল সার্ভার তিনটি ধরণের সমর্থন করে। প্রকৃতপক্ষে, আপনি যদি কখনও সিস্টেমে সঞ্চিত সমস্ত পদ্ধতি এবং স্ক্রিপ্ট করা ভিউগুলি বের করেন তবে মাইক্রোসফ্ট নিজেই ব্যবহার করেছেন এমন তিনটির উদাহরণ খুঁজে পেতে পারেন।
আরবেরি ইয়ং

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

8
যদি কলামের ডেটা টাইপ পাঠ্য হয় তবে আপনাকে প্রথমে এনভারচারে কাস্ট করতে হবে তারপরে SEPL REPLACE (REPLACE (@str কে nvarchar (সর্বোচ্চ))), CHAR (13), ''), CHAR (10), '') প্রতিস্থাপন করুন
একেডে

1
@ স্লিন্ট হ্যাঁ, ভাল কথা। ব্যবহারিকভাবে বলতে গেলে, ক্লায়েন্ট কোড থেকে এটি ব্যবহার করতে আপনার একটি কলামের নাম যুক্ত করা উচিত। যদিও এটি সত্য যে প্রচুর বার আপনি .columns[0]পরিবর্তে ব্যবহার করে পালাতে পারেন।
আরবেরি ইয়ং

2
ওরাকল আমি যে সংস্করণটি ব্যবহার করছি তার জন্য বিবৃতিটি সিএইচআর, CHAR নয়। কেবলমাত্র কেউ যদি ওরাকল থেকে ডিবাগ করার চেষ্টা করছেন। অন্যথায়, সমস্ত কিছু প্রযোজ্য।
সেডোনা

143
REPLACE(@string, CHAR(13) + CHAR(10), '')

2
এই পদ্ধতিটি আমি প্রথমে চেষ্টা করেছি, তবে এটি সমস্ত ডেটার জন্য নির্ভরযোগ্যভাবে কাজ করে না। @ আরবেরি ইউং এর ঠিক উপরে রয়েছে।
ডাব্লু ডিকসন

1
ধন্যবাদ, আমার ক্ষেত্রে এটির জন্য আমাকে কিছুটা পরিবর্তন করতে হয়েছিল, আমার ক্ষেত্রে এটির: প্রতিস্থাপন করুন (পুনরায় (@ স্ট্রিং, CHAR (13), '')), CHAR (10), '')
ইউজার 734028

36

আমি পার্টিতে একবছর দেরীতে হতে পারি, তবে আমি প্রতিদিন ক্যোয়ারী এবং এমএস-এসকিউএল নিয়ে কাজ করি এবং আমি এলটিআরআইএম () এবং আরটিআরআইএম () এবং সর্বদা তাদের একসাথে ডাকতে বাধ্য করেছি) এবং শেষদিকে নতুন লাইনে থাকা 'নোংরা' ডেটা না ধরা, তাই আমি স্থির করেছি যে আরও ভাল ট্রিম ফাংশন বাস্তবায়নের জন্য এটি উপযুক্ত সময়। আমি পিয়ার প্রতিক্রিয়া স্বাগত জানাই!

দাবি পরিত্যাগী : এই আসলে সরিয়ে ফেলা হবে , (একটি একক সাদা ব্যবধান দিয়ে প্রতিস্থাপন করে) হোয়াইটস্পেস বর্ধিত রূপ (ট্যাব, লাইন-ফিড, ঘোড়ার গাড়ি রিটার্ন, ইত্যাদি) তাই এটা আমার মূল উত্তর থেকে হিসাবে "CleanAndTrim" এ পুনরায় নামকরণ করা হয়েছে। এখানে ধারণাটি হ'ল আপনার স্ট্রিংটির অভ্যন্তরে এ জাতীয় অতিরিক্ত বিশেষ সাদা বর্ণের অক্ষরগুলির প্রয়োজন নেই এবং তাই যদি এটি মাথা / লেজে না আসে তবে সেগুলি একটি স্পেন স্পেস দিয়ে প্রতিস্থাপন করা উচিত। যদি আপনি উদ্দেশ্যযুক্তভাবে আপনার স্ট্রিংয়ে এই জাতীয় অক্ষরগুলি সঞ্চয় করেন (বলুন, আপনার ডেটা কলামে যে আপনি এটি চালাচ্ছেন), এটি করবেন না! এই ফাংশনটি উন্নত করুন বা আপনার নিজের লিখুন যা আক্ষরিকভাবে কেবল এই অক্ষরগুলি স্ট্রিংয়ের শেষ পয়েন্টগুলি থেকে সরিয়ে দেয়, 'বডি' থেকে নয়।

ঠিক আছে, এখন অস্বীকৃতি আপডেট করা হয়েছে, এখানে কোড's

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

চিয়ার্স!

অন্য অস্বীকৃতি : আপনার সাধারণ উইন্ডোজ লাইন ব্রেকটি সিআর + এলএফ, তাই যদি আপনার স্ট্রিংটিতে সেগুলি থাকে তবে আপনি তাদের "ডাবল" স্পেস দিয়ে প্রতিস্থাপন করে শেষ করতে পারেন।

আপডেট, ২০১ :: একটি নতুন সংস্করণ যা আপনাকে সেই বিশেষ-সাদা-বর্ণচিহ্নগুলি আপনার পছন্দের অন্যান্য চরিত্রেরসাথে প্রতিস্থাপনের বিকল্প দেয়! এটিতে উইন্ডোজ সিআর + এলএফ জুটির জন্য ভাষ্য এবং কাজের আশ্রয়ও অন্তর্ভুক্ত রয়েছে, অর্থাত্ সেই নির্দিষ্ট চর-জোড়াকে একক প্রতিস্থাপনের সাথে প্রতিস্থাপন করে।

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char's from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO

অতীত ব্যবহারকারীগণ, দয়া করে পরিবর্তন এবং অস্বীকৃতি নোট করুন - এবং আমি ব্যবহার এবং উদ্দেশ্য সম্পর্কে প্রাথমিক অনুমানের জন্য ক্ষমাপ্রার্থী।
NateJ

1
নতুন আপডেট! টেস্ট-কেসগুলি এখানে পাওয়া যাবে: sqlfiddle.com/#!6/585a2/1/0 - এসকিউএলফিডাল মনে হয়েছে পরীক্ষার ক্ষেত্রে আমার আসল রানটি হ্রাস পেয়েছে তবে এর পরিবর্তে, আমি একটি "টেস্ট-কেস ক্যোয়ারী বিল্ডার" টেবিলটি তৈরি করেছি & চালানোর জন্য আপনার নিজের এসএমএস উইন্ডোতে কপি-পেস্ট করার জন্য 9 টি স্টেটমেন্ট দিন (অবশ্যই স্কিমা তৈরির পরে, যেমন ফাংশন এবং টেস্টস্ট্রিংস টেবিল)।
NateJ

32

টি-এসকিউএল-এ নিউলাইনটি CHAR (13) এবং CHAR (10) (ক্যারেজ রিটার্ন + লাইন ফিড) দ্বারা প্রতিনিধিত্ব করা হয়। তদনুসারে, আপনি যে পাঠ্যটির সাহায্যে নিউলাইনটি প্রতিস্থাপন করতে চান তা দিয়ে একটি প্রতিস্থাপন বিবৃতি তৈরি করতে পারেন।

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')

9
এটি গৃহীত উত্তরের মতো নয়; গৃহীত উত্তর {13, 10 any এর কোনও সমন্বয় সরিয়ে দেয়} এটি কেবলমাত্র 13 এর পরে নির্দিষ্ট সংমিশ্রণটি সরিয়ে দেয় 10 এটি উইন্ডো লাইন সমাপ্তির জন্য আলাদা করে না, তবে অন্যান্য এনকোডিং এখানে মিস করা হবে।
অ্যান্ড্রু হিল

24

বেশিরভাগ লোকেরা যা চান তা করতে, এমন একটি স্থানধারক তৈরি করুন যা প্রকৃত লাইন ব্রেকিং চরিত্র নয়। তারপরে আপনি আসলে এর জন্য পদ্ধতির সমন্বয় করতে পারেন:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

এইভাবে আপনি কেবল একবার প্রতিস্থাপন করুন। এর পদ্ধতির:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

আপনি কেবলমাত্র সিআরএলএফ অক্ষরগুলি থেকে মুক্তি পেতে চাইলে দুর্দান্ত কাজ করে তবে আপনি যদি কোনও স্থানধারক যেমন
কিছু বা কিছু চান তবে প্রথম পদ্ধতির বিষয়টি আরও কিছুটা সঠিক more


6

যদি আপনার কলামের ডেটা টাইপ ' পাঠ্য ' হয় তবে আপনি ত্রুটি বার্তা পাবেন

Msg 8116, স্তর 16, রাজ্য 1, লাইন 2 আর্গুমেন্ট তথ্য প্রকারের পাঠ্যটি প্রতিস্থাপন ফাংশনের 1 টি আর্গুমেন্টের জন্য অবৈধ।

এই ক্ষেত্রে আপনাকে পাঠটিকে nvarchar হিসাবে কাস্ট করতে হবে এবং তারপরে প্রতিস্থাপন করতে হবে

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

ঠিক আছে, এটি দুর্দান্ত দেখাচ্ছে এখন, আমি যদি প্রতিস্থাপনের চেষ্টা করছি তা হ'ল "! Crlf" এবং হ্যাঁ! Crlf এর পরে এটি একটি স্থানের অক্ষর। উদ্বেগটি হ'ল এটি স্ট্রিংয়ের মাঝামাঝি সময়ে ঘটে যায়, আমি কি সাথে পালিয়ে যেতে পারতাম: নির্বাচন করুন প্রতিস্থাপন (রিপ্লেস (কাস্ট (ন্যুচারচর (ম্যাক্স) হিসাবে)), চর (৩৩), চর (১৩), চর (১০), চর (৩২), '') বা আমার কি এটি ভুলভাবে লেখা আছে? স্ট্রিংটি দেখতে পাওয়া যায়: দূরবর্তী আক্রমণকারীদের একটি স্যান্ডবক্স সুরক্ষা ব্যবস্থা বাইপাস করার অনুমতি দেয় এবং একটি কারুকৃত ওয়েব সাইটের মাধ্যমে সুবিধা অর্জন করতে পারে! হ্যাট ইন্টারনেট এক্সপ্লোরার দিয়ে অ্যাক্সেস করা হয়, ফোকাস করুন ! শব্দ টি টুপি ... যেটা আমার কষ্ট স্পট।
bbcompent1

3

আপনার যদি এমন কোনও সমস্যা থাকে যেখানে আপনি কেবল অনুসরণের অক্ষরগুলি সরাতে চান তবে আপনি এটি চেষ্টা করতে পারেন:

WHILE EXISTS
(SELECT * FROM @ReportSet WHERE
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32)
BEGIN
    UPDATE @ReportSet
    SET addr_3 = LEFT(addr_3,LEN(addr_3)-1)
    WHERE 
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32
END

এটি এমন ঠিকানাগুলির সাথে আমার একটি সমস্যার সমাধান করেছে যেখানে একটি পদ্ধতি একটি নির্দিষ্ট সংখ্যক লাইনের ক্ষেত্র তৈরি করেছিল, এমনকি সেই লাইনগুলি খালি থাকলেও। আমার এসএসআরএস প্রতিবেদনে স্থান বাঁচাতে আমি সেগুলি কেটে ফেলেছি।


1

আপনার যদি sp_helptext ব্যবহারের সাথে খোলার পদ্ধতি থাকে তবে কেবলমাত্র সমস্ত এসএলএল কোয়েরিতে সমস্ত পাঠ্য অনুলিপি করুন এবং সিটিআরএল + এইচ বোতামটি টিপুন নিয়মিত এক্সপ্রেশনটি ব্যবহার করে প্রতিস্থাপন করুন এবং খালি দিয়ে সন্ধান ক্ষেত্রটি প্রতিস্থাপন করুন put। N। আরও বিশদ চিত্র পরীক্ষা করুন। এখানে চিত্র বর্ণনা লিখুন



0

উপরে / পূর্বে পোস্ট করা উত্তরটি CHAR (13) CHAR (10) গাড়ীর রিটার্ন প্রতিস্থাপনের জন্য রিপোর্ট করা হয়েছিল:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

কোডটির REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')অংশটি কখনই পাবেন না এবং এর অবাঞ্ছিত ফলাফলটি ফিরিয়ে দেবেন:

'something else''something else'

এবং একটি একক এর কাঙ্ক্ষিত ফলাফল নয়:

'something else'

এর জন্য REPLACE স্ক্রিপ্টটি আবার লিখতে হবে:

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')

যেহেতু প্রবাহটি প্রথম 1 ম / সর্বাপেক্ষা বাম রিপ্লেস বিবৃতি পরীক্ষা করে, ব্যর্থতার পরে পরবর্তী প্রতিস্থাপনের বিবৃতিটি পরীক্ষা করা অবিরত থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.