จะพิมพ์ VARCHAR (MAX) โดยใช้ Print Statement ได้อย่างไร?


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 เท่านั้นดังนั้นฉันจึงใช้คำสั่งพิมพ์สองชุด

ปัญหาคือเมื่อฉันมีสคริปต์ซึ่งมีความยาว 18000 อักขระแล้วฉันเคยใช้คำสั่งพิมพ์ 3 ชุด

มีวิธีที่ฉันสามารถตั้งค่าจำนวนคำสั่งพิมพ์ขึ้นอยู่กับความยาวของสคริปต์ได้หรือไม่?


1
คุณต้องใช้PRINTหรือคุณเปิดรับทางเลือกอื่นหรือไม่?
Martin Smith

ฉันขอแนะนำให้สร้าง (หรือค้นหาและโหวต) สำหรับปัญหาบน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

หากคุณดูรหัสของฉันฉันยังใช้ตัวแปร @Pos เพื่อค้นหาตัวแบ่งบรรทัดและพิมพ์ตามนั้น ฉันจะใช้มันในโค้ดของคุณได้อย่างไร
เตอร์

@peter คุณสามารถใช้กระแสSUBSTRและดูเฉพาะส่วนที่คุณจัดการในเวลานั้นและทำซ้ำในสิ่งนั้นหรือถ้าคุณรู้ว่าจะมีการแบ่งบรรทัดก่อนขีด จำกัด 8k ในแต่ละครั้งจากนั้นทำWHILEตามการค้นหาบรรทัด หยุดพัก
Kelsey

@peter คุณสามารถวนซ้ำตามตัวแบ่งบรรทัดได้หรือไม่? เช่นมองหา linebreak หากพบว่า print up to line break, substr จาก line break เป็น 8k chars ถัดไป, ค้นหา, พิมพ์, substr ใหม่เป็นต้น?
Kelsey

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
@gordy - สำหรับฉันแล้วดูเหมือนว่าวิธีนี้ใช้ไม่ได้จริงใน SSMS
Jirka Hanika

1
สิ่งนี้ใช้ได้กับฉันใน SQL 2008 R2 SP2 (10.50.1600) โดยใช้ CAST () หรือ CONVERT () และบน SQL 2008 SP2 (10.0.5500)

26
ฉันเห็นการตัดทอนหลังจาก 16,002 อักขระ แต่ยังคงยาวกว่าmaxนั้น DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
Martin Smith

6
ประเภทข้อมูล ntext ข้อความและรูปภาพจะถูกลบออกใน Microsoft SQL Server เวอร์ชันอนาคต หลีกเลี่ยงการใช้ประเภทข้อมูลเหล่านี้ในงานพัฒนาใหม่และวางแผนที่จะแก้ไขแอปพลิเคชันที่ใช้อยู่ในปัจจุบัน
jumxozizi

5
ไม่ได้ผลสำหรับฉันใน SQL Server Management Studio สำหรับ SQL Server 2014 มันตัดหลังจาก 16.000 อักขระ ตามที่เขียนโดย Martin Smith
Jana Weschenfelder

103

วิธีแก้ปัญหาต่อไปนี้ไม่ใช้PRINTคำสั่ง ทำงานร่วมกับ SQL Server Management Studio ได้ดี

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

คุณสามารถคลิกที่ XML ที่ส่งคืนเพื่อขยายในโปรแกรมดู XML ในตัว

มีขีด จำกัด ฝั่งไคลเอ็นต์ที่ค่อนข้างใจดีเกี่ยวกับขนาดที่แสดง ไปที่Tools/Options/Query Results/SQL Server/Results to Grid/XML dataเพื่อปรับเปลี่ยนหากจำเป็น


11
+1. แต่วิธีนี้เข้ารหัสอักขระที่มีความหมายพิเศษใน XML ยกตัวอย่างเช่นจะถูกแทนที่ด้วย< &lt;
Iain Samuel McLean Elder

5
คุณสามารถเขียนสคริปต์โดยไม่<root>....ชอบ:SELECT CAST(@MyLongString AS XML)
ali youhannaei

2
@aliyouhannaei - ใช่และไม่ใช่ คุณคิดถูกที่องค์ประกอบรากไม่จำเป็นอย่างยิ่ง แต่หากไม่มีส่วน CDATA วิธีของคุณจะเริ่มมีปัญหากับบางสตริง โดยเฉพาะอย่างยิ่งที่มี <. หากไม่ใช่ XML แบบสอบถามมักจะผิดพลาด หากเป็น XML สตริงอาจถูกฟอร์แมตใหม่เป็นรูปแบบ XML "เทียบเท่า" อื่น
Jirka Hanika

8
@IainElder - นั่นเป็นจุดที่ดีและมีวิธีแก้ปัญหาสำหรับมันจากอดัม Machanic นี่คือ: SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH(''). สตริงจะพันด้วย PI ที่เรียกว่า "x" แต่ PI จะไม่ถูกรวมไว้ในองค์ประกอบอื่น (เนื่องจากPATH(''))
Jirka Hanika

สิ่งนี้จะใช้ไม่ได้กับข้อความที่ยาวมากแม้ว่าจะมีการตั้งค่า "Maximum Characters Retrieved - XML ​​data" เป็นไม่ จำกัด
Michael Møldrup

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
เทคนิคสุดล้ำ! BTW บทความจริงที่มาจากเทคนิคนี้มาจาก SQLServerCentral.com >>> sqlservercentral.com/scripts/Print/63240
Rob.Kachmar

2
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่มันก็สับชื่อเขตข้อมูลของฉันลงครึ่งหนึ่งด้วย ดังนั้นถ้าฉันใช้วิธีนี้ในการพิมพ์ (@string) แล้วดำเนินการ (@string) การดำเนินการจะล้มเหลว
Johnny Bones

1
สิ่งนี้ไม่ได้ผลสำหรับฉันเนื่องจากฟังก์ชัน PRINT เพิ่มการแบ่งบรรทัดในสถานที่ที่ไม่ดีและจะต้องมีการล้างข้อมูลมากกว่าที่ควรค่า แต่นี่เป็นวิธีแก้ปัญหาที่ใกล้เคียงที่สุด
Randy Burden

14

เจอคำถามนี้และต้องการอะไรที่ง่ายกว่านี้ ... ลองทำดังนี้:

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

5
ง่ายกว่านั้นจะSELECT CAST(@STMT AS XML)เป็นไปตามที่ระบุไว้แล้วในความคิดเห็นอื่น สร้างเอาต์พุตที่เหมือนกันทุกประการและมีความซับซ้อนน้อยกว่าการสร้างโพรซีเดอร์ที่เก็บไว้สำหรับเอาต์พุต
Felix Bayer

4
@Felix แม้ว่าจะง่ายกว่ามาก แต่ก็ไม่ได้ผลกับ SQL การส่งไปยัง XML พยายามแปลงข้อความ SQL เป็น XML มันจะแทนที่ <,> และ & ด้วย & lt ;, & gt; และ & amp; และจะไม่จัดการตัวอักษรที่ไม่อนุญาตใน XML นอกจากนี้หากคุณมีสถานการณ์ที่คุณทำการเปรียบเทียบ <และจากนั้น> จะคิดว่าเป็นองค์ประกอบและแสดงข้อผิดพลาดของโหนดที่ไม่ถูกต้อง
Edyn

12

proc นี้พิมพ์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

โพรซีเดอร์นี้มีข้อขัดแย้งกับอักขระ Unicode วิธีจัดการ utf8 เช่น?
mostafa8026

ในการตอบกลับความคิดเห็นด้านบนสามารถทำได้โดยเปลี่ยนประเภท @script เป็น nvarchar
mostafa8026

8

ฉันต้องการใช้คำสั่งการพิมพ์เพื่อแก้จุดบกพร่องของ sql แบบไดนามิกเนื่องจากฉันคิดว่าพวกคุณส่วนใหญ่ใช้การพิมพ์ด้วยเหตุผลที่เหมือนกัน

ฉันลองใช้วิธีแก้ปัญหาบางอย่างในรายการและพบว่าโซลูชันของ Kelsey ทำงานได้กับแหนบรอง (@sql คือ @script ของฉัน) 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)

รหัสนี้ทำตามที่แสดงความคิดเห็นเพิ่มบรรทัดใหม่ลงในเอาต์พุต แต่สำหรับการดีบักนี่ไม่ใช่ปัญหาสำหรับฉัน

โซลูชันของ Ben B นั้นสมบูรณ์แบบและมีความสง่างามที่สุดแม้ว่าการดีบักจะมีโค้ดหลายบรรทัดดังนั้นฉันจึงเลือกที่จะใช้การปรับเปลี่ยน Kelsey เล็กน้อยของฉัน อาจคุ้มค่าที่จะสร้างระบบเช่นขั้นตอนการจัดเก็บใน msdb สำหรับรหัสของ Ben B ซึ่งสามารถใช้ซ้ำและเรียกได้ในบรรทัดเดียว?

รหัสของ Alfoks ใช้งานไม่ได้เพราะน่าจะง่ายกว่า


ฉันเพิ่งเพิ่มโซลูชันของ Ben B เป็นโพรซีเดอร์ที่เก็บไว้ชั่วคราว ทำให้สคริปต์ของฉันสะอาดขึ้นเล็กน้อย แต่ฉันยอมรับว่ามันมีหลายบรรทัดสำหรับการดีบัก
ซาเรเฟ ธ


4

ฉันเพิ่งสร้าง SP จากคำตอบที่ยอดเยี่ยมของ Ben :

/*
---------------------------------------------------------------------------------
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

ยอดเยี่ยมสิ่งที่ฉันกำลังมองหา!
kooch

3
สร้างกระบวนงาน dbo.PrintMax @text nvarchar (สูงสุด)
เช่น
เริ่ม
    ประกาศ @i int, @newline nchar (2), @print varchar (สูงสุด); 
    ตั้งค่า @newline = nchar (13) + nchar (10);
    เลือก @i = charindex (@newline, @text);
    ในขณะที่ (@i> 0)
    เริ่ม
        เลือก @print = สตริงย่อย (@ text, 0, @ i);
        ในขณะที่ (len (@print)> 8000)
        เริ่ม
            พิมพ์สตริงย่อย (@ พิมพ์ 0,8000);
            เลือก @print = สตริงย่อย (@ print, 8000, len (@print));
        จบ
        พิมพ์ @print;
        เลือก @text = สตริงย่อย (@ text, @ i + 2, len (@text));
        เลือก @i = charindex (@newline, @text);
    จบ
    พิมพ์ @text;
จบ

2

มีฟังก์ชั่นที่ดีเรียกว่าเป็นPrintMax เขียนโดยเบนเน็ตต์ดิลล์

นี่คือเวอร์ชันที่แก้ไขเล็กน้อยซึ่งใช้ขั้นตอนการจัดเก็บ temp เพื่อหลีกเลี่ยง "schema polution" (แนวคิดจาก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;');

การสาธิต DBFiddle

แก้ไข:

การใช้CREATE OR ALTERเราสามารถหลีกเลี่ยงการเรียก EXEC สองครั้ง:

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

ใช้ Line Feeds และ Space เป็นจุดพักที่ดี:

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

ทำงานได้อย่างไม่มีที่ติ
Jolley71717


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

หากซอร์สโค้ดไม่มีปัญหากับ LF ที่จะถูกแทนที่ด้วย CRLF ไม่จำเป็นต้องมีการดีบักโดยทำตามเอาต์พุตโค้ดอย่างง่าย

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

เวอร์ชัน PrintMax ของฉันเพื่อป้องกันไม่ให้บรรทัดที่ไม่ถูกต้องบนเอาต์พุต:


    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.