سؤال

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

تبدو سلسلة العمود حاليا كما يلي:

Questions about **general computing hardware and software** are off-topic for Stack Overflow unless they directly involve tools used primarily for programming. You may be able to get help on [Super User](http://superuser.com/about)

أنا أعمل حاليا مع نص غامق ومائل.هذا يعني (في حالة النص الغامق) وسوف تحتاج إلى استبدال الغريب ن مرات نمط**مع<b>وحتى الأوقات مع</b>.
رأيت يستعاض() لكنها تؤدي الاستبدال على جميع أنماط السلسلة.

فكيف يمكنني استبدال سلسلة فرعية فقط إذا كانت غريبة أو فقط حتى?

تحديث: يتساءل بعض الناس ما هي المخططات التي أستخدمها ، لذا ألق نظرة فقط هنا.

واحد إضافي إذا كنت تريد: الارتباط التشعبي نمط تخفيض السعر إلى الارتباط التشعبي هتمل لا تبدو بسيطة جدا.

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

المحلول

باستخدامSTUFFوظيفة وبسيطةWHILEحلقة:

CREATE FUNCTION dbo.fn_OddEvenReplace(@text nvarchar(500), 
                                      @textToReplace nvarchar(10), 
                                      @oddText nvarchar(10), 
                                      @evenText nvarchar(500))
RETURNS varchar(max)
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    RETURN @text
END

ويمكنك استخدامه مثل هذا:

SELECT dbo.fn_OddEvenReplace(column, '**', '<b>', '</b>')
FROM table

تحديث:

يتم إعادة كتابة هذا باعتباره س:

CREATE PROC dbo.##sp_OddEvenReplace @text nvarchar(500), 
                                  @textToReplace nvarchar(10), 
                                  @oddText nvarchar(10), 
                                  @evenText nvarchar(10),
                                  @returnText nvarchar(500) output
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    SET @returnText = @text
END
GO

وتنفيذ:

DECLARE @returnText nvarchar(500)
EXEC dbo.##sp_OddEvenReplace '**a** **b** **c**', '**', '<b>', '</b>', @returnText output

SELECT @returnText

نصائح أخرى

حسب طلب OP، قمت بتعديل إجاباتي السابقة لأداء كإجراء مخزن مؤقت.لقد تركت إجابتي السابقة كما أعتقد أن الاستخدام ضد جدول سلاسل ليكون مفيدا أيضا.

إذا كان من المعروف أن جدول رصيد (أو أرقام) موجودا بالفعل مع ما لا يقل عن 8000 قيم، فيمكن حذف القسم العلفي من CTE وتم استبدال المرجع CTE بنسبة باسمجدول Tally الحالي.

giveacodicetagpre.

استدعاء مثل هذا:

giveacodicetagpre.

تعادل كإخراج:

giveacodicetagpre.

أحد الخيارات هو استخدام تعبير عادي لأنه يجعل استبدال هذه الأنماط أمرا بسيطا للغاية.لا يتم تضمين وظائف التعبير العادي في سكل سيرفر لذلك تحتاج إلى استخدام سكل كلر ، إما تجميعها من قبلك أو من مكتبة موجودة.

في هذا المثال سوف أستخدم سكل# (سكلشارب) مكتبة (وأنا مؤلف) ولكن وظائف التعبير العادي متوفرة في نسخة مجانية.

SELECT SQL#.RegEx_Replace
(
   N'Questions about **general computing hardware and software** are off-topic\
for Stack Overflow unless **they** directly involve tools used primarily for\
**programming. You may be able to get help on [Super User]\
(https://superuser.com/about)', -- @ExpressionToValidate
   N'\*\*([^\*]*)\*\*', -- @RegularExpression
   N'<b>$1</b>', -- @Replacement
   -1, -- @Count (-1 = all)
   1, - @StartAt
   'IgnoreCase' -- @RegEx options
);

النمط أعلاه \*\*([^\*]*)\*\* فقط يبحث عن أي شيء محاط بعلامات نجمية مزدوجة.في هذه الحالة لا داعي للقلق حول الغريب / حتى.هذا يعني أيضا أنك لن تحصل على تشكيل سيئ <b>- علامة فقط إذا كان هناك سبب إضافي ** في السلسلة.أضفت حالتين اختبار إضافية إلى السلسلة الأصلية:مجموعة كاملة من ** حول الكلمة they ومجموعة لا مثيل لها من ** قبل الكلمة مباشرة programming.الإخراج هو:

Questions about <b>general computing hardware and software</b> are off-topicfor Stack Overflow unless <b>they</b> directly involve tools used primarily for **programming. You may be able to get help on [Super User](https://superuser.com/about)

الذي يجعل كما:

أسئلة حول أجهزة وبرامج الحوسبة العامة خارج الموضوع لتجاوز المكدس ما لم هم تشمل مباشرة الأدوات المستخدمة في المقام الأول ل * * البرمجة.قد تتمكن من الحصول على المساعدة سوبر المستخدم

هذا الحل يستخدم التقنيات الموصوفة بواسطة Jeff Moden في هذه المقالة على المبلغ قيد التشغيلمشكلة في SQL .هذا الحل مطول، ولكن عن طريق الاستفادة من quirky Update في SQL Server عبر فهرس متفاوت المسافات، يحتفظ بوعد كونك أكثر كفاءة على مجموعات البيانات الكبيرة من الحلول القائمة على المؤشر.

تحديث - المعدل أدناه لتشغيل جدول من السلاسل

على افتراض وجود جدول رصيد تم إنشاؤه مثل هذا (مع ما لا يقل عن 8000 صف):

giveacodicetagpre.

و htmltagspotter وظيفة محددة مثل هذا:

giveacodicetagpre.

ثم تشغيل SQL التالي سيؤدي الاستبدال المطلوب.لاحظ أن الانضمام الداخلي في النهاية يمنع أي علامات "غريبة" زائدة من تحويلها:

giveacodicetagpre.

العائد:

giveacodicetagpre.

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