سؤال

ما هي أفضل طريقة لاستبدال كافة "&lt" بـ < في عمود قاعدة بيانات معين؟أداء في الأساس s/&lt[^;]/</gi

ملحوظات:

  • يجب أن تعمل في خادم MS SQL 2000
  • يجب أن تكون قابلة للتكرار (ولا تنتهي بـ <;;;;;;;;;)
هل كانت مفيدة؟

المحلول

بعض القرصنة مطلوبة ولكن يمكننا القيام بذلك باستخدام يحب, باتندكس, غادر و يمين وتسلسل سلسلة قديمة جيدة.

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

while 1 = 1
begin
    update test
        set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                      '&lt;' +
                      right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
    from test
    where val like '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
end

select * from test

الأفضل هو أن هذا الإصدار غير محدد لـ SQL Server ويجب أن يعمل بشكل جيد.

نصائح أخرى

أعتقد أنه يمكن القيام بذلك بشكل أكثر نظافة إذا كنت تستخدم أشياء مختلفة :)

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

WHILE 1 = 1
BEGIN
    UPDATE test SET
        val = STUFF( val , PATINDEX('%&lt[^;]%', val) + 3 , 0 , ';' )
    FROM test
    WHERE val LIKE '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
END

select * from test

ماذا عن:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt', '&lt;')
    WHERE columnName LIKE '%lt%'
    AND columnName NOT LIKE '%lt;%'

يحرر:

لقد أدركت للتو أن هذا سيتجاهل الأعمدة الصحيحة جزئيًا &lt; سلاسل.

في هذه الحالة يمكنك تجاهل الجزء الثاني من جملة المكان واستدعاء هذا بعد ذلك:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')

هذا المقال يغطي كيفية إنشاء وظيفة Regex Replace بسيطة يمكنك استخدامها في SQL 2000 (و 2005 مع قرص بسيط) والتي يمكن أن تساعدك.

إذا كانت نكهة regex الخاصة بـ MSSQL تدعم المظهر السلبي، فسيكون هذا هو الطريق الصحيح للتعامل مع هذا الأمر.

s/&lt(?!;)/&lt;/gi

سوف يمسك بجميع حالات & لتر التي لا يتبعها أ ; (وإن لم يتبعهم شيء) [^;] سوف يخطئ) ولا يلتقط ما يلي غير-; الشخصية كجزء من المباراة، مما يؤدي إلى إزالة المشكلة المذكورة في التعليقات على السؤال الأصلي المتمثلة في فقدان تلك الشخصية في الاستبدال.

لسوء الحظ، أنا لا أستخدم MSSQL، لذلك ليس لدي أي فكرة عما إذا كان يدعم البحث السلبي أم لا ...

محدد جدًا لهذا النمط، لكنني فعلت شيئًا مشابهًا في الماضي:

REPLACE(REPLACE(columName, '&lt;', '&lt'), '&lt', '&lt;')

مثال أوسع (ترميز الأحرف التي قد تكون غير مناسبة في سمة TITLE)

REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    columName
    -- Remove existing encoding:
    , '&amp;', '&')
    , '&#34;', '"')
    , '&#39;', '''')
    -- Reinstate/Encode:
    , '&', '&amp;')
    -- Encode:
    , '"', '&#34;')
    , '''', '&#39;')
    , ' ', '%20')
    , '<', '%3C')
    , '>', '%3E')
    , '/', '%2F')
    , '\', '%5C')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top