এসকিউএল সার্ভার - NTEXT কলাম এবং স্ট্রিং ম্যানিপুলেশন


11

আমি একজন সঙ্গে একটি টেবিল আছে NTEXTকলাম নামক comments। আমার একটি দ্বিতীয় স্ট্রিং রয়েছে, আসুন এটিকে anothercomment(ক varchar) কল করুন commentsযা শব্দের পরে প্রদত্ত স্ট্রিংয়ের ভিতরে স্থাপন করা দরকার UPDATEHERE

স্ট্রিং কে nvarchar(max)কাটাতে কাস্ট করা comments, তাই আমি CHARINDEX()( Msg 8152, Level 16, State 10, Line 2 String or binary data would be truncated.)। আমি datalength()এখানে 8000 টি অক্ষরের কয়েক হাজার কলাম আছে তা পরীক্ষা করে দেখতে চাইছি) ব্যবহার করতে পারি না ।

আমি কী অর্জন করতে চাই তার একটি উদাহরণ (দীর্ঘতর স্ট্রিং থাকা সত্ত্বেও):

মন্তব্য - This is a test UPDATEHERE This is the end of the test

অন্য মন্তব্য - . This is inserted.

ফলাফল স্ট্রিং - This is a test UPDATEHERE. This is inserted. This is the end of the test

আমি বুঝতে পারি যে এটি একটি সাধারণ varchar()/ এর সাথে তুচ্ছ nvarchar(), তবে ntextএটির সাথে কাজ করার জন্য একটি সম্পূর্ণ এবং একদম দুঃস্বপ্ন। আমি বুঝতে পারি এটি একটি অবহেলিত ডেটা টাইপ, তবে আমি প্রশ্নটিতে আবেদনটি লিখিনি not

উত্তর:


8

nvarchar(max)আপনি যদি আপনার কিছু ভুল না করে থাকেন তবে তা রূপান্তর করা উচিতCHARINDEX()

এই কোড স্নিপেট চেষ্টা করুন, এটি আপনার যা চায় তা আউটপুট করা উচিত।

-- Create the table
CREATE TABLE [dbo].[PhilsTable](
    [comment] [ntext] NULL,
    [anothercomment] [nvarchar](50) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];

GO

-- insert very long string
INSERT INTO [dbo].[PhilsTable] (comment, anothercomment) VALUES (N'This is a test UPDATEHERE This is the end of the test' + REPLICATE (CAST(N'x' AS nvarchar(max)), 1000000), 'this goes in here');

-- verify data
SELECT DATALENGTH(comment), *  FROM [dbo].[PhilsTable];

-- perform replace
SELECT CAST(REPLACE(CAST(comment AS NVARCHAR(MAX)),'UPDATEHERE','UPDATEHERE' + anothercomment) AS NTEXT) FROM [dbo].[PhilsTable];

DROP TABLE [dbo].[PhilsTable];

বিবৃতিটি সাহায্য করার জন্য অ্যান্ড্রি এমকে ধন্যবাদ জানাইREPLICATE


10

কোনও কোড দৃষ্টিকোণ থেকে জীবনকে nvarchar(max)পিছনে রূপান্তর করা ntextজীবনকে সহজ করে তোলে, তবে এর অর্থ হ'ল সমস্ত সিপিইউ এবং লগিং ওভারহেড যা বোঝায় তার সাথে পুরো (সম্ভবত খুব বড়) মানটি রূপান্তর এবং পুনর্লিখন।

একটি বিকল্প ব্যবহার করা হয় UPDATETEXT। এটি ঠিক যেমনটি ntextহ্রাস করা হয় তবে এটি লগিং ওভারহেডকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে। ডাউনসাইডে, এর অর্থ পাঠ্য পয়েন্টার ব্যবহার করা এবং এটি একবারে কেবল একটি সারিতে কাজ করে।

নিম্নলিখিত সীমাবদ্ধতার চারপাশে কাজ করার জন্য নিম্নলিখিত উদাহরণ কোডটি একটি কার্সার ব্যবহার PATINDEXকরে এবং এর পরিবর্তে ব্যবহার করে CHARINDEXযেহেতু প্রাক্তন কয়েকটি ফাংশন যা সরাসরি কাজ করে তাদের মধ্যে একটি ntext:

নমুনা তথ্য

CREATE TABLE dbo.PhilsTable
(
    comment ntext NULL,
    anothercomment nvarchar(50) NULL
);

INSERT dbo.PhilsTable
    (comment, anothercomment)
VALUES 
(
    CONVERT(ntext, 
        N'This is a test UPDATEHERE This is the end of the test ' + 
            REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)), 
    CONVERT(nvarchar(50), N'. This is inserted.')
),
(
    CONVERT(ntext, 
        N'This is a test UPDATEHERE This is the end of the test ' + 
            REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)), 
    CONVERT(nvarchar(50), N'. This is inserted.')
),
(
    CONVERT(ntext, 
        N'This is a test UPDATEHERE This is the end of the test ' + 
            REPLICATE (CONVERT(nvarchar(max), N'x'), 1000000)), 
    CONVERT(nvarchar(50), N'. This is inserted.')
);

কার্সার ঘোষণা

DECLARE c 
    CURSOR GLOBAL 
    FORWARD_ONLY 
    DYNAMIC 
    SCROLL_LOCKS 
    TYPE_WARNING
FOR
SELECT
    TxtPtr = TEXTPTR(PT.comment),
    Src = PT.anothercomment,
    Offset = PATINDEX(N'%UPDATEHERE%', PT.comment) + LEN(N'UPDATEHERE') - 1
FROM dbo.PhilsTable AS PT
WHERE
    PT.comment LIKE N'%UPDATEHERE%'; -- LIKE works with ntext

OPEN c;

প্রক্রিয়া লুপ

DECLARE 
    @Ptr binary(16),
    @Src nvarchar(50),
    @Offset integer;

SET STATISTICS XML OFF; -- No cursor fetch plans

BEGIN TRANSACTION;

    WHILE 1 = 1
    BEGIN
        FETCH c INTO @Ptr, @Src, @Offset;

        IF @@FETCH_STATUS = -2 CONTINUE; -- row missing
        IF @@FETCH_STATUS = -1 BREAK; -- no more rows

        IF 1 = TEXTVALID('dbo.PhilsTable.comment', @Ptr)
        BEGIN
            -- Modify ntext value
            UPDATETEXT dbo.PhilsTable.comment @Ptr @Offset 0 @Src;
        END;
    END;

COMMIT TRANSACTION;

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