কীভাবে মুদ্রণ বিবরণী ব্যবহার করে ভর্চার (ম্যাক্স) মুদ্রণ করবেন?


108

আমার একটি কোড রয়েছে যা হ'ল:

DECLARE @Script VARCHAR(MAX)

SELECT @Script = definition FROM manged.sys.all_sql_modules sq
where sq.object_id = (SELECT object_id from managed.sys.objects 
Where type = 'P' and Name = 'usp_gen_data')

Declare @Pos int

SELECT  @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,7500)

PRINT SUBSTRING(@Script,1,@Pos)

PRINT SUBSTRING(@script,@pos,8000)

স্ক্রিপ্টটির দৈর্ঘ্য 10,000 টি অক্ষর এবং যেহেতু আমি মুদ্রণ বিবরণী ব্যবহার করছি যা কেবল সর্বোচ্চ 8000 ধরে রাখতে পারে So তাই আমি দুটি মুদ্রণ বিবৃতি ব্যবহার করছি।

সমস্যাটি যখন তখন আমার কাছে একটি স্ক্রিপ্ট থাকে যা 18000 অক্ষর বলে থাকে তখন আমি 3 মুদ্রণ বিবৃতি ব্যবহার করতাম।

সুতরাং, আমি স্ক্রিপ্ট দৈর্ঘ্যের উপর নির্ভর করে মুদ্রণ বিবৃতি সংখ্যা সেট করতে পারে যে কোন উপায় আছে?


1
আপনার কি ব্যবহার করতে হবে PRINTবা আপনি অন্যান্য বিকল্পের জন্য উন্মুক্ত?
মার্টিন স্মিথ

আমি তৈরি (অথবা খোঁজার এবং ভোট দেওয়ার) একটি সমস্যার জন্য সুপারিশ করছি connect.microsoft.com/SQLServer/Feedback
jmoreno

উত্তর:


23

আপনি WHILEআপনার স্ক্রিপ্ট দৈর্ঘ্যের উপর ভিত্তি করে 8000 দ্বারা বিভক্ত লুপ করতে পারেন ।

উদাহরণ:

DECLARE @Counter INT
SET @Counter = 0
DECLARE @TotalPrints INT
SET @TotalPrints = (LEN(@script) / 8000) + 1
WHILE @Counter < @TotalPrints 
BEGIN
    -- Do your printing...
    SET @Counter = @Counter + 1
END

আপনি যদি আমার কোডটি দেখুন তবে আমি লাইন ব্রেকটি খুঁজে পেতে @ পস ভেরিয়েবলটিও ব্যবহার করছি এবং সেই অনুযায়ী মুদ্রণ করব। সুতরাং আমি কিভাবে আপনার কোড ব্যবহার করতে পারে।
পিটার

@ ইপিটার আপনি কেবল বর্তমানটি নিতে পারেন SUBSTRএবং আপনি যে অংশটি পরিচালনা করছেন ঠিক সেই অংশটি দেখতে পারেন এবং তার উপর পুনরাবৃত্তি করতে পারেন বা আপনি যদি জানেন যে প্রতিবার 8 কে সীমার আগে একটি লাইন ব্রেক হবে তবে কেবল WHILEলাইন অনুসন্ধানের ভিত্তিতে করুন বিরতি.
কেলসি

@ পেটার আপনি লাইন বিরতির উপর ভিত্তি করে লুপ করতে পারেন? উদাহরণস্বরূপ লাইনব্রেকের সন্ধান করুন, যদি লাইন ব্রেক পর্যন্ত মুদ্রণ পাওয়া যায়, লাইন ব্রেক থেকে পরের 8k চরগুলিতে সাবস্ট্রাস্ট করুন, অনুসন্ধান করুন, মুদ্রণ করুন, নতুন সাবস্ট্রাস্টার ইত্যাদি?
কেলসি

1
ফাংশনটি LEN () LENGTH () নয়
shiggity

8
আমি print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))আমার স্ক্রিপ্ট মুদ্রণ করতাম।
Lukas Thum

217

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি কী করেছি তা এখানে উল্লেখ করা হয়নি।

আমার জন্য নিম্নলিখিত কাজ করে।

DECLARE @info NVARCHAR(MAX)

--SET @info to something big

PRINT CAST(@info AS NTEXT)

4
@ গর্ডি - সুতরাং আমার কাছে মনে হচ্ছে এই পদ্ধতিটি এসএসএমএসে আসলে কাজ করে না।
জিরকা হানিকা

1
এটি CAQL () বা কনভার্ট () এবং এসকিউএল ২০০৮ এসপি 2 (10.0.5500) এর মাধ্যমে এসকিউএল ২০০৮ আর 2 এসপি 2 (10.50.1600) এ আমার জন্য কাজ করে।

26
আমি 16,002 টি অক্ষরের পরে ছাঁটাই দেখতে পাচ্ছি, এখনও তার চেয়ে বেশি দীর্ঘ maxDECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
মার্টিন স্মিথ

6
মাইক্রোসফ্ট এসকিউএল সার্ভারের ভবিষ্যতের সংস্করণে এনটেক্সট, পাঠ্য এবং চিত্রের ডেটা প্রকারগুলি সরানো হবে। নতুন ডেটা ডেভলপমেন্ট কাজে এই ডেটা প্রকারগুলি ব্যবহার করা এড়িয়ে চলুন এবং বর্তমানে সেগুলি ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিকে সংশোধন করার পরিকল্পনা করুন।
jumxozizi

5
এসকিউএল সার্ভার ২০১৪-এর এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে আমার পক্ষে কাজ করেনি It এটি 16.000 অক্ষরের পরে কেটে যায়। যেমনটি লিখেছেন মার্টিন স্মিথ।
জানা ওয়েসচেনফেল্ডার

103

নিম্নলিখিত workaround PRINTবিবৃতি ব্যবহার করে না । এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর সাথে একত্রে ভাল কাজ করে।

SELECT CAST('<root><![CDATA[' + @MyLongString + ']]></root>' AS XML)

এক্সটিএমএল বিল্ট-ইন ভিউয়ারে এটি প্রসারিত করতে আপনি ফিরে আসা এক্সএমএলে ক্লিক করতে পারেন।

প্রদর্শিত আকারে একটি দুর্দান্ত উদার ক্লায়েন্টের সীমা রয়েছে। Tools/Options/Query Results/SQL Server/Results to Grid/XML dataপ্রয়োজনে এটি সামঞ্জস্য করতে যান ।


11
+1 টি। তবে এই পদ্ধতিটি এমন অক্ষরগুলিকে এনকোড করে যা এক্সএমএলে একটি বিশেষ অর্থ রয়েছে। উদাহরণস্বরূপ, এর <সাথে প্রতিস্থাপিত হয় &lt;
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

5
আপনি লিখিত ছাড়াই স্ক্রিপ্ট লিখতে <root>....পারেন:SELECT CAST(@MyLongString AS XML)
ali youhannaei

2
@ এলিয়ৌহান্নই - হ্যাঁ এবং না আপনি ঠিক বলেছেন যে মূল উপাদান কঠোরভাবে প্রয়োজনীয় নয়। তবে, সিডিএটিএ বিভাগটি ছাড়াই আপনার পদ্ধতিতে কিছু স্ট্রিং নিয়ে সমস্যা শুরু হয়। বিশেষত যা << যদি তারা এক্সএমএল না হয় তবে ক্যোয়ারীটি সাধারণত ত্রুটি থেকে বেরিয়ে আসে। যদি তারা এক্সএমএল হয় তবে স্ট্রিংটি অন্য "সমতুল্য" এক্সএমএল ফর্মটিতে পুনরায় ফর্ম্যাট করা যেতে পারে।
জিরকা হানিকা

8
@ আইইনএল্ডার - এটি একটি ভাল বিষয় এবং এটির জন্য অ্যাডাম মাচানিকের কাছ থেকে একটি পরিকল্পনা রয়েছে । এটা এই আছে: SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')। স্ট্রিংটি "x" নামক একটি পিআইতে আবৃত হবে, তবে পিআই অন্য কোনও উপাদানগুলিতে আবৃত হবে না (কারণ PATH(''))।
জিরকা হানিকা

এটি "সর্বাধিক অক্ষর পুনরুদ্ধার - এক্সএমএল ডেটা"
সীমাহীনতে

39

এটি কীভাবে করা উচিত তা এখানে:

DECLARE @String NVARCHAR(MAX);
DECLARE @CurrentEnd BIGINT; /* track the length of the next substring */
DECLARE @offset tinyint; /*tracks the amount of offset needed */
set @string = replace(  replace(@string, char(13) + char(10), char(10))   , char(13), char(10))

WHILE LEN(@String) > 1
BEGIN
    IF CHARINDEX(CHAR(10), @String) between 1 AND 4000
    BEGIN
           SET @CurrentEnd =  CHARINDEX(char(10), @String) -1
           set @offset = 2
    END
    ELSE
    BEGIN
           SET @CurrentEnd = 4000
            set @offset = 1
    END   
    PRINT SUBSTRING(@String, 1, @CurrentEnd) 
    set @string = SUBSTRING(@String, @CurrentEnd+@offset, LEN(@String))   
END /*End While loop*/

Http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html থেকে নেওয়া


1
দুর্দান্ত কৌশল! বিটিডব্লিউ, আসল নিবন্ধটি যা এই কৌশলটির উদ্ভব করেছে এটি এসকিউএল
সার্ভারসেন্ট্রাল ডট

2
এটি আমার পক্ষে কাজ করেছিল তবে এটি আমার ক্ষেত্রের একটির নামটি অর্ধেকে কেটে ফেলেছে। সুতরাং, আমি যদি এই পদ্ধতিটি প্রিন্ট (@ স্ট্রিং) এবং তারপরে এক্সেক্যুট (@ স্ট্রিং) ব্যবহার করি তবে এক্সিকিউটি ব্যর্থ।
জনি

1
এটি আমার পক্ষে কাজ করে না কারণ PRINT ফাংশন খারাপ জায়গায় লাইন বিরতি যুক্ত করে এবং এটির চেয়ে বেশি পরিচ্ছন্নতার প্রয়োজন হবে তবে এটিই সমস্যার নিকটতম সমাধান।
র‌্যান্ডি বার্ডেন

14

এই প্রশ্নটি এসেছিল এবং আরও সাধারণ কিছু চাইছিল ... নিম্নলিখিত বিষয়গুলি চেষ্টা করুন:

SELECT [processing-instruction(x)]=@Script FOR XML PATH(''),TYPE

5
আরও সাধারণ SELECT CAST(@STMT AS XML)হিসাবে ইতিমধ্যে অন্য মন্তব্যে বলা হয়েছে। ঠিক একই আউটপুট উত্পাদন করে এবং আউটপুট জন্য সঞ্চিত পদ্ধতি তৈরির চেয়ে প্রকৃতপক্ষে কম জটিল।
ফেলিক্স বায়ার

4
@ ফেলিক্স এটি অনেক সহজ হতে পারে, এটি এসকিউএল-এর পক্ষে কার্যকরভাবে কাজ করে না। এক্সএমএলে কাস্টিং এসকিউএল পাঠ্যটিকে এক্সএমএলে রূপান্তর করার চেষ্টা করে। এটি <,>, এবং & lt ;, & gt এর সাথে প্রতিস্থাপন করবে; এবং & amp; এবং এটি XML- এ অনুমোদিত নয় এমন অক্ষর পরিচালনা করবে না। অতিরিক্তভাবে, যদি আপনার এমন কোনও পরিস্থিতি থাকে যেখানে আপনি <এবং তারপরে> তুলনা করেন তবে এটি মনে করে এটি একটি উপাদান এবং একটি অবৈধ নোড ত্রুটি।
এডিন

12

মোড়কের কথা VARCHAR(MAX)বিবেচনা করে এই প্রকোপটি সঠিকভাবে প্যারামিটারগুলি মুদ্রণ করে :

CREATE PROCEDURE [dbo].[Print]
    @sql varchar(max)
AS
BEGIN
    declare
        @n int,
        @i int = 0,
        @s int = 0, -- substring start posotion
        @l int;     -- substring length

    set @n = ceiling(len(@sql) / 8000.0);

    while @i < @n
    begin
        set @l = 8000 - charindex(char(13), reverse(substring(@sql, @s, 8000)));
        print substring(@sql, @s, @l);
        set @i = @i + 1;
        set @s = @s + @l + 2; -- accumulation + CR/LF
    end

    return 0
END

এই পদ্ধতিটির ইউনিকোড অক্ষরগুলির সাথে বিরোধ রয়েছে। উদাহরণস্বরূপ utf8 হ্যান্ডেল কিভাবে?
মোস্তফা 8026

উপরের মন্তব্যের জবাবে, এটি @ স্ক্রিপ্টের ধরণটি এনভারচারে পরিবর্তন করে করা যেতে পারে।
মোস্তফা 8026

8

আপনারা বেশিরভাগ প্রিমিয়ার কারণে প্রিন্ট ব্যবহার করছেন বলে আমি কল্পনা করেছি বলে কিছু গতিশীল এসকিএল ডিবাগ করার জন্য আমি মুদ্রণ বিবৃতিটি ব্যবহার করতে চাইছিলাম।

আমি তালিকাভুক্ত কয়েকটি সমাধানের চেষ্টা করে দেখেছি যে কেলসির সমাধানটি ছোটখাট টুইটগুলি (@ এসকিউএলটি আমার @ লিপিটি) এর সাথে কাজ করে NB LENGTH একটি বৈধ ফাংশন নয়:

--http://stackoverflow.com/questions/7850477/how-to-print-varcharmax-using-print-statement
--Kelsey
DECLARE @Counter INT
SET @Counter = 0
DECLARE @TotalPrints INT
SET @TotalPrints = (LEN(@sql) / 4000) + 1
WHILE @Counter < @TotalPrints 
BEGIN
    PRINT SUBSTRING(@sql, @Counter * 4000, 4000)
    SET @Counter = @Counter + 1
END
PRINT LEN(@sql)

এই কোডটি মন্তব্য হিসাবে আউটপুটে একটি নতুন লাইন যুক্ত করে, তবে এটি ডিবাগিংয়ের জন্য আমার পক্ষে সমস্যা নয়।

বেন বি এর সমাধানটি নিখুঁত এবং সবচেয়ে নিখুঁত, যদিও ডিবাগিংয়ের জন্য কোডের অনেকগুলি লাইন তাই আমি কেলসির আমার সামান্য পরিবর্তনটি বেছে নিতে চাই। বেন বি এর কোডের জন্য এমএসডিবিতে সঞ্চিত পদ্ধতির মতো একটি সিস্টেম তৈরি করা উপযুক্ত যা একটি লাইনে পুনরায় ব্যবহার এবং কল করা যেতে পারে?

Alfoks এর কোড দুর্ভাগ্যজনকভাবে কাজ করে না কারণ এটি আরও সহজ হত।


আমি কেবল অস্থায়ী সঞ্চিত প্রক্রিয়া হিসাবে বেন বি এর সমাধান যুক্ত করেছি। আমার স্ক্রিপ্টগুলি কিছুটা পরিষ্কার রাখে, তবে আমি সম্মত হই যে এটি ডিবাগিংয়ের জন্য অনেকগুলি লাইন।
জেরেফেথ

4

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

declare @i int = 1
while Exists(Select(Substring(@Script,@i,4000))) and (@i < LEN(@Script))
begin
     print Substring(@Script,@i,4000)
     set @i = @i+4000
end

4

আমি স্রেফ বেনের দুর্দান্ত উত্তরটি থেকে একটি এসপি তৈরি করেছি :

/*
---------------------------------------------------------------------------------
PURPOSE   : Print a string without the limitation of 4000 or 8000 characters.
/programming/7850477/how-to-print-varcharmax-using-print-statement
USAGE     : 
DECLARE @Result NVARCHAR(MAX)
SET @Result = 'TEST'
EXEC [dbo].[Print_Unlimited] @Result
---------------------------------------------------------------------------------
*/
ALTER PROCEDURE [dbo].[Print_Unlimited]
    @String NVARCHAR(MAX)
AS

BEGIN

    BEGIN TRY
    ---------------------------------------------------------------------------------

    DECLARE @CurrentEnd BIGINT; /* track the length of the next substring */
    DECLARE @Offset TINYINT; /* tracks the amount of offset needed */
    SET @String = replace(replace(@String, CHAR(13) + CHAR(10), CHAR(10)), CHAR(13), CHAR(10))

    WHILE LEN(@String) > 1
    BEGIN
        IF CHARINDEX(CHAR(10), @String) BETWEEN 1 AND 4000
        BEGIN
            SET @CurrentEnd =  CHARINDEX(CHAR(10), @String) -1
            SET @Offset = 2
        END
        ELSE
        BEGIN
            SET @CurrentEnd = 4000
            SET @Offset = 1
        END   
        PRINT SUBSTRING(@String, 1, @CurrentEnd) 
        SET @String = SUBSTRING(@String, @CurrentEnd + @Offset, LEN(@String))   
    END /*End While loop*/

    ---------------------------------------------------------------------------------
    END TRY
    BEGIN CATCH
        DECLARE @ErrorMessage VARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()    
        RAISERROR(@ErrorMessage,16,1)
    END CATCH
END

আশ্চর্য, ঠিক আমি কী খুঁজছিলাম!
কোচ

3
প্রক্রিয়া তৈরি করুন ডিবিও.প্রিন্টম্যাক্স @ টেক্সট এনভারচার (সর্বাধিক)
যেমন
শুরু করা
    @i int ঘোষণা করুন, @ নিউলাইন এনসিআর (2), @ প্রিন্ট বারচর (সর্বোচ্চ); 
    @ নিউউলাইন = এনসিআর (13) + এনসিআর (10) সেট করুন;
    @i = Charindex (@ নিউলাইন, @ টেক্সট) নির্বাচন করুন;
    (@ আমি> 0)
    শুরু করা
        @ প্রিন্ট = সাবস্ট্রিং নির্বাচন করুন (@ পাঠ্য, 0, @ i);
        যখন (লেন (@ প্রিন্ট)> 8000)
        শুরু করা
            প্রিন্ট সাবস্ট্রিং (@ মুদ্রণ, 0,8000);
            @ প্রিন্ট = সাবস্ট্রিং নির্বাচন করুন (@ মুদ্রণ, 8000, লেন (@ প্রিন্ট));
        শেষ
        @ মুদ্রণ;
        @text = সাবস্ট্রিং (@ পাঠ্য, @ আমি + 2, লেন (@ পাঠ্য)) নির্বাচন করুন;
        @i = Charindex (@ নিউলাইন, @ টেক্সট) নির্বাচন করুন;
    শেষ
    @ টেক্সট মুদ্রণ করুন;
শেষ

2

বেনেট ডিলের লেখা প্রিন্টম্যাক্স নামে দুর্দান্ত ফাংশন রয়েছে ।

এখানে কিছুটা সংশোধিত সংস্করণ দেওয়া আছে যা "স্কিমা দূষণ" এড়াতে অস্থায়ী সঞ্চিত পদ্ধতি ব্যবহার করে ( https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql থেকে ধারণা )

EXEC (N'IF EXISTS (SELECT * FROM tempdb.sys.objects 
                   WHERE object_id = OBJECT_ID(N''tempdb..#PrintMax'') 
                   AND type in (N''P'', N''PC''))
    DROP PROCEDURE #PrintMax;');
EXEC (N'CREATE PROCEDURE #PrintMax(@iInput NVARCHAR(MAX))
AS
BEGIN
    IF @iInput IS NULL
    RETURN;

    DECLARE @ReversedData NVARCHAR(MAX)
          , @LineBreakIndex INT
          , @SearchLength INT;

    SET @SearchLength = 4000;

    WHILE LEN(@iInput) > @SearchLength
    BEGIN
    SET @ReversedData = LEFT(@iInput COLLATE DATABASE_DEFAULT, @SearchLength);
    SET @ReversedData = REVERSE(@ReversedData COLLATE DATABASE_DEFAULT);
    SET @LineBreakIndex = CHARINDEX(CHAR(10) + CHAR(13),
                          @ReversedData COLLATE DATABASE_DEFAULT);
    PRINT LEFT(@iInput, @SearchLength - @LineBreakIndex + 1);
    SET @iInput = RIGHT(@iInput, LEN(@iInput) - @SearchLength 
                        + @LineBreakIndex - 1);
    END;

    IF LEN(@iInput) > 0
    PRINT @iInput;
END;');

ডিবিফিডাল ডেমো

সম্পাদনা করুন:

ব্যবহার করে CREATE OR ALTERআমরা দুটি এক্সইসি কল এড়াতে পারি:

EXEC (N'CREATE OR ALTER PROCEDURE #PrintMax(@iInput NVARCHAR(MAX))
AS
BEGIN
    IF @iInput IS NULL
    RETURN;

    DECLARE @ReversedData NVARCHAR(MAX)
          , @LineBreakIndex INT
          , @SearchLength INT;

    SET @SearchLength = 4000;

    WHILE LEN(@iInput) > @SearchLength
    BEGIN
    SET @ReversedData = LEFT(@iInput COLLATE DATABASE_DEFAULT, @SearchLength);
    SET @ReversedData = REVERSE(@ReversedData COLLATE DATABASE_DEFAULT);
    SET @LineBreakIndex = CHARINDEX(CHAR(10) + CHAR(13), @ReversedData COLLATE DATABASE_DEFAULT);
    PRINT LEFT(@iInput, @SearchLength - @LineBreakIndex + 1);
    SET @iInput = RIGHT(@iInput, LEN(@iInput) - @SearchLength + @LineBreakIndex - 1);
    END;

    IF LEN(@iInput) > 0
    PRINT @iInput;
END;');

db <> ফিডাল ডেমো


2

লাইন ফিডস এবং স্পেসগুলি একটি ভাল ব্রেক পয়েন্ট হিসাবে ব্যবহার করে:

declare @sqlAll as nvarchar(max)
set @sqlAll = '-- Insert all your sql here'

print '@sqlAll - truncated over 4000'
print @sqlAll
print '   '
print '   '
print '   '

print '@sqlAll - split into chunks'
declare @i int = 1, @nextspace int = 0, @newline nchar(2)
set @newline = nchar(13) + nchar(10)


while Exists(Select(Substring(@sqlAll,@i,3000))) and (@i < LEN(@sqlAll))
begin
    while Substring(@sqlAll,@i+3000+@nextspace,1) <> ' ' and Substring(@sqlAll,@i+3000+@nextspace,1) <> @newline
    BEGIN
        set @nextspace = @nextspace + 1
    end
    print Substring(@sqlAll,@i,3000+@nextspace)
    set @i = @i+3000+@nextspace
    set @nextspace = 0
end
print '   '
print '   '
print '   '


2

বা সহজভাবে:

PRINT SUBSTRING(@SQL_InsertQuery, 1, 8000)
PRINT SUBSTRING(@SQL_InsertQuery, 8001, 16000)

0

এখানে অন্য সংস্করণ। এটি প্রতিটি লুপের উপর 4000 দ্বারা মূল স্ট্রিং হ্রাস করার পরিবর্তে মূল স্ট্রিং থেকে মুদ্রণের জন্য প্রতিটি স্ট্রিংগুলি আহরণ করে (এটি হুডের নীচে অনেক দীর্ঘ স্ট্রিং তৈরি করতে পারে - নিশ্চিত নয়)।

CREATE PROCEDURE [Internal].[LongPrint]
    @msg nvarchar(max)
AS
BEGIN

    -- SET NOCOUNT ON reduces network overhead
    SET NOCOUNT ON;

    DECLARE @MsgLen int;
    DECLARE @CurrLineStartIdx int = 1;
    DECLARE @CurrLineEndIdx int;
    DECLARE @CurrLineLen int;   
    DECLARE @SkipCount int;

    -- Normalise line end characters.
    SET @msg = REPLACE(@msg, char(13) + char(10), char(10));
    SET @msg = REPLACE(@msg, char(13), char(10));

    -- Store length of the normalised string.
    SET @MsgLen = LEN(@msg);        

    -- Special case: Empty string.
    IF @MsgLen = 0
    BEGIN
        PRINT '';
        RETURN;
    END

    -- Find the end of next substring to print.
    SET @CurrLineEndIdx = CHARINDEX(CHAR(10), @msg);
    IF @CurrLineEndIdx BETWEEN 1 AND 4000
    BEGIN
        SET @CurrLineEndIdx = @CurrLineEndIdx - 1
        SET @SkipCount = 2;
    END
    ELSE
    BEGIN
        SET @CurrLineEndIdx = 4000;
        SET @SkipCount = 1;
    END     

    -- Loop: Print current substring, identify next substring (a do-while pattern is preferable but TSQL doesn't have one).
    WHILE @CurrLineStartIdx < @MsgLen
    BEGIN
        -- Print substring.
        PRINT SUBSTRING(@msg, @CurrLineStartIdx, (@CurrLineEndIdx - @CurrLineStartIdx)+1);

        -- Move to start of next substring.
        SET @CurrLineStartIdx = @CurrLineEndIdx + @SkipCount;

        -- Find the end of next substring to print.
        SET @CurrLineEndIdx = CHARINDEX(CHAR(10), @msg, @CurrLineStartIdx);
        SET @CurrLineLen = @CurrLineEndIdx - @CurrLineStartIdx;

        -- Find bounds of next substring to print.              
        IF @CurrLineLen BETWEEN 1 AND 4000
        BEGIN
            SET @CurrLineEndIdx = @CurrLineEndIdx - 1
            SET @SkipCount = 2;
        END
        ELSE
        BEGIN
            SET @CurrLineEndIdx = @CurrLineStartIdx + 4000;
            SET @SkipCount = 1;
        END
    END
END

0

এটি ঠিকভাবে কাজ করা উচিত এটি পূর্বের উত্তরের একটি উন্নতি মাত্র।

DECLARE @Counter INT
DECLARE @Counter1 INT
SET @Counter = 0
SET @Counter1 = 0
DECLARE @TotalPrints INT
SET @TotalPrints = (LEN(@QUERY) / 4000) + 1
print @TotalPrints 
WHILE @Counter < @TotalPrints 
BEGIN
-- Do your printing...
print(substring(@query,@COUNTER1,@COUNTER1+4000))

set @COUNTER1 = @Counter1+4000
SET @Counter = @Counter + 1
END

0

যদি সোর্স কোডে সিআরএলএফ দ্বারা প্রতিস্থাপনের জন্য এলএফ-তে কোনও সমস্যা না থাকে, সাধারণ কোড আউটপুট অনুসরণ করে কোনও ডিবাগিংয়ের প্রয়োজন হয় না।

--http://stackoverflow.com/questions/7850477/how-to-print-varcharmax-using-print-statement
--Bill Bai
SET @SQL=replace(@SQL,char(10),char(13)+char(10))
SET @SQL=replace(@SQL,char(13)+char(13)+char(10),char(13)+char(10) )
DECLARE @Position int 
WHILE Len(@SQL)>0 
BEGIN
SET @Position=charindex(char(10),@SQL)
PRINT left(@SQL,@Position-2)
SET @SQL=substring(@SQL,@Position+1,len(@SQL))
end; 

0

আউটপুটটিতে খারাপ লাইন বিরতি রোধের জন্য আমার প্রিন্টম্যাক্স সংস্করণ:


    CREATE PROCEDURE [dbo].[PrintMax](@iInput NVARCHAR(MAX))
    AS
    BEGIN
      Declare @i int;
      Declare @NEWLINE char(1) = CHAR(13) + CHAR(10);
      While LEN(@iInput)>0 BEGIN
        Set @i = CHARINDEX(@NEWLINE, @iInput)
        if @i>8000 OR @i=0 Set @i=8000
        Print SUBSTRING(@iInput, 0, @i)
        Set @iInput = SUBSTRING(@iInput, @i+1, LEN(@iInput))
      END
    END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.