كيفية إدراج فاصل أسطر في سلسلة SQL Server VARCHAR/NVARCHAR

StackOverflow https://stackoverflow.com/questions/31057

  •  09-06-2019
  •  | 
  •  

سؤال

لم أر أي أسئلة مماثلة تم طرحها حول هذا الموضوع، وكان علي أن أبحث في هذا الأمر عن شيء أعمل عليه الآن.اعتقدت أنني سأقوم بنشر الإجابة عليه في حال كان لدى أي شخص آخر نفس السؤال.

هل كانت مفيدة؟

المحلول 2

لقد وجدت الجواب هنا: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/

ما عليك سوى توصيل السلسلة وإدراج ملف CHAR(13) حيث تريد فاصل السطر الخاص بك.

مثال:

DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text

هذا يطبع ما يلي:

هذا هو السطر 1.
هذا هو السطر 2.

نصائح أخرى

char(13) يكون CR.لنمط DOS-/Windows CRLF فواصل الأسطر، تريد char(13)+char(10), ، يحب:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'

هناك طريقة أخرى للقيام بذلك وهي كالتالي:

INSERT CRLF SELECT 'fox 
jumped'

وهذا يعني أن مجرد إدراج فاصل أسطر في الاستعلام الخاص بك أثناء كتابته سيضيف فاصل مماثل إلى قاعدة البيانات.يعمل هذا في استوديو إدارة خادم SQL ومحلل الاستعلام.أعتقد أن هذا سيعمل أيضًا في C# إذا كنت تستخدم علامة @ على السلاسل.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"

قم بتشغيل هذا في SSMS، فهو يوضح كيف تصبح فواصل الأسطر في SQL نفسها جزءًا من قيم السلسلة التي تمتد عبر الأسطر:

PRINT 'Line 1
Line 2
Line 3'
PRINT ''

PRINT 'How long is a blank line feed?'
PRINT LEN('
')
PRINT ''

PRINT 'What are the ASCII values?'
PRINT ASCII(SUBSTRING('
',1,1))
PRINT ASCII(SUBSTRING('
',2,1))

نتيجة :
خط 1
خط 2
السطر 3

ما هي مدة تغذية السطر الفارغ؟
2

ما هي قيم ASCII؟
13
10

أو إذا كنت تفضل تحديد السلسلة الخاصة بك في سطر واحد (تقريبًا!) فيمكنك توظيفها REPLACE() مثل هذا (استخدام اختياريا CHAR(13)+CHAR(10) كبديل):

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')

بعد جوجل...

أخذ الكود من الموقع:

CREATE TABLE CRLF
    (
        col1 VARCHAR(1000)
    )

INSERT CRLF SELECT 'The quick brown@'
INSERT CRLF SELECT 'fox @jumped'
INSERT CRLF SELECT '@over the '
INSERT CRLF SELECT 'log@'

SELECT col1 FROM CRLF

Returns:

col1
-----------------
The quick brown@
fox @jumped
@over the
log@

(4 row(s) affected)


UPDATE CRLF
SET col1 = REPLACE(col1, '@', CHAR(13))

يبدو أنه يمكن القيام بذلك عن طريق استبدال العنصر النائب بـ شار(13)

سؤال جيد، لم أفعل ذلك بنفسي :)

لقد جئت إلى هنا لأنني كنت قلقًا من عدم ظهور cr-lfs التي حددتها في سلاسل C# في استجابات استعلام SQl Server Management Studio.

اتضح أنهم هناك، ولكن لا يتم عرضهم.

"لرؤية" cr-lfs، استخدم عبارة الطباعة مثل:

declare @tmp varchar(500)    
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp

فيما يلي دالة C# التي تسبق سطر نص إلى كائن نصي كبير الحجم، محدد بواسطة CRLFs، وترجع تعبير T-SQL مناسبًا لـ INSERT أو UPDATE عمليات.إنها تحتوي على بعض الأخطاء المتعلقة بالتعامل مع حقوق الملكية، ولكن بمجرد حذفها، قد يكون ذلك مفيدًا - آمل ذلك.

/// <summary>
/// Generate a SQL string value expression suitable for INSERT/UPDATE operations that prepends
/// the specified line to an existing block of text, assumed to have \r\n delimiters, and
/// truncate at a maximum length.
/// </summary>
/// <param name="sNewLine">Single text line to be prepended to existing text</param>
/// <param name="sOrigLines">Current text value; assumed to be CRLF-delimited</param>
/// <param name="iMaxLen">Integer field length</param>
/// <returns>String: SQL string expression suitable for INSERT/UPDATE operations.  Empty on error.</returns>
private string PrependCommentLine(string sNewLine, String sOrigLines, int iMaxLen)
{
    String fn = MethodBase.GetCurrentMethod().Name;

    try
    {
        String [] line_array = sOrigLines.Split("\r\n".ToCharArray());
        List<string> orig_lines = new List<string>();
        foreach(String orig_line in line_array) 
        { 
            if (!String.IsNullOrEmpty(orig_line))  
            {  
                orig_lines.Add(orig_line);    
            }
        } // end foreach(original line)

        String final_comments = "'" + sNewLine + "' + CHAR(13) + CHAR(10) ";
        int cum_length = sNewLine.Length + 2;
        foreach(String orig_line in orig_lines)
        {
            String curline = orig_line;
            if (cum_length >= iMaxLen) break;                // stop appending if we're already over
            if ((cum_length+orig_line.Length+2)>=iMaxLen)    // If this one will push us over, truncate and warn:
            {
                Util.HandleAppErr(this, fn, "Truncating comments: " + orig_line);
                curline = orig_line.Substring(0, iMaxLen - (cum_length + 3));
            }
            final_comments += " + '" + curline + "' + CHAR(13) + CHAR(10) \r\n";
            cum_length += orig_line.Length + 2;
        } // end foreach(second pass on original lines)

        return(final_comments);


    } // end main try()
    catch(Exception exc)
    {
        Util.HandleExc(this,fn,exc);
        return("");
    }
}

أريد أن أقول

concat('This is line 1.', 0xd0a, 'This is line 2.')

أو

concat(N'This is line 1.', 0xd000a, N'This is line 2.')

يعد هذا أمرًا رائعًا دائمًا، لأنه عندما تحصل على قوائم مُصدَّرة من Oracle، على سبيل المثال، فإنك تحصل على سجلات تمتد على عدة أسطر، والتي بدورها يمكن أن تكون مثيرة للاهتمام، على سبيل المثال، لملفات cvs، لذا كن حذرًا.

على أي حال، إجابة روب جيدة، لكنني أنصح باستخدام شيء آخر غير @، جرب المزيد، مثل §§@@§§ أو شيء من هذا القبيل، لذلك سيكون لديها فرصة لبعض التفرد.(ولكن مع ذلك، تذكر طول varchar/nvarchar الحقل الذي تقوم بالإدراج فيه..)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top