प्रिंट स्टेटमेंट का उपयोग करके VARCHAR (MAX) कैसे प्रिंट करें?


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)

स्क्रिप्ट की लंबाई लगभग १०,००० वर्ण है और चूंकि मैं प्रिंट स्टेटमेंट का उपयोग कर रहा हूं जो केवल अधिकतम is००० पकड़ सकता है। इसलिए मैं दो प्रिंट स्टेटमेंट का उपयोग कर रहा हूं।

समस्या तब है जब मेरे पास एक स्क्रिप्ट है जो कहने के लिए है 18000 अक्षर तब मैं 3 प्रिंट स्टेटमेंट का उपयोग करता था।

तो क्या ऐसा कोई तरीका है जो मैं स्क्रिप्ट की लंबाई के आधार पर प्रिंट स्टेटमेंट की संख्या निर्धारित कर सकता हूं?


1
क्या आपको उपयोग करना है PRINTया आप अन्य विकल्पों के लिए खुले हैं?
मार्टिन स्मिथ

मैं बनाने के लिए (या खोजने और मतदान) पर एक मुद्दा के लिए सुझाव देंगे connect.microsoft.com/SQLServer/Feedback
jmoreno

जवाबों:


23

आप WHILE8000 से विभाजित अपनी स्क्रिप्ट की लंबाई के आधार पर एक लूप कर सकते हैं ।

ईजी:

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

यदि आप मेरे कोड को देखते हैं तो मैं लाइन ब्रेक खोजने और तदनुसार प्रिंट करने के लिए @ पीओएस चर का उपयोग कर रहा हूं। तो मैं इसे आपके कोड में कैसे उपयोग कर सकता हूं।
पीटर

@peter आप बस करंट ले सकते हैं SUBSTRऔर उस समय केवल उसी भाग को देख सकते हैं जिस पर आप काम कर रहे हैं और उस पर पुनरावृति कर रहे हैं या यदि आप जानते हैं कि हर बार 8k सीमा से पहले एक लाइन ब्रेक होगा तो बस WHILEलाइन खोजने पर आधारित करें टूट जाता है।
केल्सी

@ आप लाइन ब्रेक के आधार पर लूप कर सकते हैं? उदाहरण के लिए लाइनब्रेक देखें, यदि लाइन ब्रेक के लिए प्रिंट अप पाया जाता है, तो लाइन ब्रेक से लेकर अगले 8k चार्ट, सर्च, प्रिंट, न्यू सब्सट्रेट आदि तक का रूट?
केल्सी

1
समारोह है LEN () नहीं LENGTH ()
शगुन

8
मैं print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))अपनी स्क्रिप्ट छापता था।
लुकास थुम

217

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने जो किया वह यहाँ उल्लेखित नहीं है।

मेरे लिए निम्नलिखित काम किया।

DECLARE @info NVARCHAR(MAX)

--SET @info to something big

PRINT CAST(@info AS NTEXT)

4
@ गोर्डी - तो मुझे ऐसा लगता है कि यह विधि वास्तव में एसएसएमएस में काम नहीं करती है।
जिरका हनिका

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);
मार्टिन स्मिथ

6
Microsoft SQL सर्वर के भविष्य के संस्करण में ntext, पाठ और छवि डेटा प्रकार हटा दिए जाएंगे। नए विकास कार्यों में इन डेटा प्रकारों का उपयोग करने से बचें, और उन अनुप्रयोगों को संशोधित करने की योजना बनाएं जो वर्तमान में उनका उपयोग करते हैं।
12

5
SQL सर्वर 2014 के लिए SQL सर्वर प्रबंधन स्टूडियो में मेरे लिए काम नहीं किया। यह 16.000 वर्णों के बाद कटौती करता है। जैसा कि मार्टिन स्मिथ ने लिखा है।
जना वेसचेनफेलर

103

निम्न समाधान PRINTकथन का उपयोग नहीं करता है । यह SQL सर्वर प्रबंधन स्टूडियो के साथ संयोजन में अच्छी तरह से काम करता है।

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

आप अंतर्निहित एक्सएमएल दर्शक में इसे विस्तारित करने के लिए दिए गए एक्सएमएल पर क्लिक कर सकते हैं।

प्रदर्शित आकार पर एक बहुत ही उदार ग्राहक पक्ष सीमा है। Tools/Options/Query Results/SQL Server/Results to Grid/XML dataजरूरत पड़ने पर इसे समायोजित करने के लिए जाएं ।


11
+1। लेकिन यह विधि उन वर्णों को कूटबद्ध करती है जिनका XML में एक विशेष अर्थ होता है। उदाहरण के लिए, के <साथ प्रतिस्थापित किया गया है &lt;
इयान सैमुअल मैकलीन एल्डर

5
आप इस <root>....तरह से बिना स्क्रिप्ट लिख सकते हैं:SELECT CAST(@MyLongString AS XML)
अलिया आपनैनी

2
@ आलियौहनै - हां और ना। आप सही हैं कि मूल तत्व कड़ाई से आवश्यक नहीं है। लेकिन, CDATA सेक्शन के बिना, आपके तरीके को कुछ स्ट्रिंग्स से परेशानी होने लगती है। विशेष रूप से उन है कि शामिल हैं <। यदि वे एक्सएमएल नहीं हैं, तो क्वेरी आमतौर पर त्रुटि होगी। यदि वे एक्सएमएल हैं, तो स्ट्रिंग दूसरे "समकक्ष" एक्सएमएल फॉर्म में रिफॉर्मैटेड हो सकती है।
जिरका हनिका

8
@ आईनएल्ड - यह एक अच्छा बिंदु है और एडम मैकहानिक से इसके लिए एक समाधान है । यह है SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH(''):। स्ट्रिंग को "x" नामक PI में लपेटा जाएगा, लेकिन PI को किसी अन्य तत्व (क्योंकि 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
बढ़िया तकनीक! BTW, इस तकनीक से उत्पन्न वास्तविक लेख SQLServerCentral.com >>> sqlservercentral.com/scripts/Print/63240
Rob.Kachmar

2
इसने मेरे लिए काम किया, लेकिन इसने मेरे क्षेत्र के आधे नामों में से एक को काट दिया। इसलिए, अगर मैंने इस विधि का उपयोग PRINT (@string) और फिर EXECUTE (@string) के लिए किया, तो EXECUTE विफल हो जाता है।
जॉनी बोन्स

1
यह मेरे लिए काम नहीं करता है क्योंकि PRINT फ़ंक्शन खराब जगहों पर लाइन ब्रेक जोड़ता है और इसके लिए अधिक सफाई की आवश्यकता होती है, लेकिन यह समस्या का निकटतम समाधान है।
रैंडी बर्डन

14

इस सवाल पर आया था और कुछ और सरल चाहता था ... निम्नलिखित की कोशिश करें:

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

5
अधिक सरल SELECT CAST(@STMT AS XML)जैसा कि पहले ही एक अन्य टिप्पणी में कहा गया है। वास्तव में एक ही आउटपुट का उत्पादन करता है और वास्तव में आउटपुट के लिए संग्रहीत प्रक्रिया बनाने की तुलना में कम जटिल है।
फेलिक्स बायर

4
@ फेलिक्स जबकि यह बहुत सरल होगा, यह SQL के लिए काफी काम नहीं करता है। XML पर कास्टिंग SQL टेक्स्ट को XML में बदलने की कोशिश करता है। यह <,>, और & 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 को कैसे संभालें?
Mostafa8026

उपरोक्त टिप्पणी के उत्तर में, इसे @ स्क्रिप्ट प्रकार को nvarchar में बदलकर किया जा सकता है।
Mostafa8026

8

मैं प्रिंट स्टेटमेंट का उपयोग कुछ गतिशील एसक्यूएल को डीबग करने के लिए करना चाह रहा था क्योंकि मैं कल्पना करता हूं कि आप में से अधिकांश सिलेयर कारणों से प्रिंट का उपयोग कर रहे हैं।

मैंने सूचीबद्ध कुछ समाधानों की कोशिश की और पाया कि केल्सी का समाधान मामूली चिमटी के साथ काम करता है (@sql is my @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)

यह कोड आउटपुट में एक नई लाइन जोड़ने के लिए टिप्पणी करता है, लेकिन डिबगिंग के लिए यह मेरे लिए कोई समस्या नहीं है।

बेन बी का समाधान एकदम सही है और सबसे अधिक सुरुचिपूर्ण है, हालांकि डिबगिंग के लिए कोड की बहुत सारी लाइनें हैं इसलिए मैं केल्सी के अपने मामूली संशोधन का उपयोग करने का चयन करता हूं। यह बेन बी के कोड के लिए एमएसडीबी में संग्रहीत प्रक्रिया जैसी एक प्रणाली बनाने के लायक हो सकता है जिसे एक पंक्ति में पुन: उपयोग और कॉल किया जा सकता है?

अल्फोकस कोड दुर्भाग्य से काम नहीं करता है क्योंकि यह आसान होता।


मैंने बस बेन बी के समाधान को एक अस्थायी संग्रहीत प्रक्रिया के रूप में जोड़ा। मेरी लिपियों को थोड़ा साफ रखता है, लेकिन मैं मानता हूं कि यह डिबगिंग के लिए बहुत सारी लाइनें हैं।
ज़ेरेफ़ेथ

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
प्रक्रिया बनाएँ dbo.PrintMax @text nvarchar (अधिकतम)
जैसा
शुरू
    घोषित करें @ आई इंट, @newline nchar (2), @print varchar (मैक्स); 
    सेट @newline = nchar (13) + nchar (10);
    @i = charindex (@newline, @text) का चयन करें;
    जबकि (@i> 0)
    शुरू
        @print = substring (@ पाठ, 0, @ i) का चयन करें;
        जबकि (लेन (@प्रिंट)> 8000)
        शुरू
            प्रिंट विकल्प (@ प्रिंट, 0,8000);
            @print = substring (@ प्रिंट, 8000, len (@print)) का चयन करें;
        समाप्त
        प्रिंट @ छाप;
        @text = substring (@ टेक्स्ट, @ i + 2, len (@text)) का चयन करें;
        @i = charindex (@newline, @text) का चयन करें;
    समाप्त
    प्रिंट @text;
समाप्त

2

बेनेट डिल द्वारा लिखित PrintMax नामक महान कार्य है ।

यहाँ थोड़ा संशोधित संस्करण है जो "स्कीमा पॉल्यूशन" ( 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

लाइन ब्रेक और रिक्त स्थान को एक अच्छे ब्रेक पॉइंट के रूप में उपयोग करता है:

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

निर्दोष रूप से काम किया
जोले 17१ Nov१

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

यदि स्रोत कोड में LRL के साथ 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.