sql - تحويل سكل أي شار إلى صفر 0




ssis transform (3)

أنا لا أرى وسيلة للقيام بذلك دون وظيفة، والتي سوف تقتل على الأداء. ومع ذلك، هناك العديد من هناك. هنا واحد.

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '0')
    END
    RETURN @strText
END

الاعدام

declare @table table (x varchar(64) )
insert into @table
values
('332148790832473487...DFSKDJFH&#@[email protected]#'),
('0X0C0V1234')

update t
set x = dbo.RemoveNonNumericCharacters(t.x)
from @table t

select * from @table

عائدات

x
33214879083247348700000000000000000
0000001234

بدلا من ذلك، في وظيفة يمكنك فقط إزالة غير رقمية عن طريق تغيير

STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '0')

إلى...

STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')

لذلك أنا استكشاف جدول حيث وجدت اثنين من الحقول التي ينبغي أن تكون الأرقام، ولكن كمصدر هو ملف اكسل حتى الناس قد مختلطة بالفعل الحروف والرموز والأرقام.

أنا أحاول تنظيف هذه الحقول ولكن يمكنني العثور على أنواع كثيرة جدا من الرموز حتى الآن، لقد أجريت تنظيف مع بضع حالات مثل:

SELECT
    CASE 
       WHEN Montant_Devise LIKE '%Free%' THEN '0'
       WHEN Montant_Devise LIKE ' ' THEN '0'
       WHEN Montant_Devise = '' THEN '0' 
       WHEN Montant_Devise = '-' THEN '0' 
       ELSE CAST(COALESCE(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(Montant_Devise, '€', ''), ' ', ''), ',', '.'))), '0') AS DECIMAL(20,2))
    END
FROM
    [dbo].[table_BI]

لذا، فإن الصفقة هنا هي ربما أنا قد تجد رموز جديدة في المستقبل من لتجنب تضمين رموز جديدة في حالتي أود أن أعرف كيف يمكنني استبدال لا يهم أي رمز أو حرف من الافتراضي 0 صفر.

هل تعرف الرجال كيف يمكنني القيام بذلك؟

شكر


أبدا ب

CASE WHEN patindex(Montant_Devise  '%[^0-9]%' > 0 '0'

ثم القيام سلسلة فارغة. ثم القيام بك آخر.


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

كنت أواجه هذه المسألة ، لكنني أعتقد أني قمت بحلها بطريقة متطورة للغاية - الطريقة التي يستخدمها المتسللون لتجنب استخدام الاقتباسات. لقد استخدمت هذا بالاقتران مع البيانات المعدلة المحذوفة. يمكنني استخدامه لمنع جميع أنواع هجمات حقن SQL المحتملة.

مقاربتي:

  • إذا كنت تتوقع أن يكون الإدخال عددًا صحيحًا ، فتأكد من أنه صحيح بالفعل . في لغة من نوع متغير مثل PHP من المهم جدا . يمكنك استخدام هذا الحل البسيط جدًا على سبيل المثال: sprintf("SELECT 1,2,3 FROM table WHERE 4 = %u", $input);

  • إذا كنت تتوقع أي شيء آخر من عرافة صحيح ذلك . إذا كنت ستعطيه ، فسوف تفلت تماما من كل المدخلات. في C / C ++ هناك وظيفة تسمى mysql_hex_string() ، في PHP يمكنك استخدام bin2hex() .

    لا تقلق من أن السلسلة المهربة سيكون لها حجم 2x من طولها الأصلي لأنه حتى لو كنت تستخدم mysql_real_escape_string ، يجب على PHP تخصيص نفس السعة ((2*input_length)+1) ، وهو نفس الشيء.

  • غالبًا ما تستخدم هذه الطريقة السداسية عند نقل البيانات الثنائية ، ولكن لا أرى أي سبب لعدم استخدامها على جميع البيانات لمنع هجمات حقن SQL. لاحظ أنه يجب عليك إرسال البيانات UNHEX 0x إلى 0x أو استخدام الدالة MySQL ، بدلاً من ذلك ، بدلاً من ذلك.

لذلك ، على سبيل المثال ، الاستعلام:

SELECT password FROM users WHERE name = 'root'

سيصبح:

SELECT password FROM users WHERE name = 0x726f6f74

أو

SELECT password FROM users WHERE name = UNHEX('726f6f74')

الهيكس هو الهروب المثالي. لا توجد وسيلة لحقن.

الفرق بين وظيفة ال UNEX والبادئة 0x

كان هناك بعض النقاش في التعليقات ، لذا أود في النهاية توضيح ذلك. هذان الأسلوبان متشابهان للغاية ، ولكنهما مختلفان بعض الشيء من بعض النواحي:

يمكن استخدام البادئة ** 0x ** لأعمدة البيانات فقط مثل char أو varchar أو text أو block أو binary أو غير ذلك .
كما أن استخدامه معقد بعض الشيء إذا كنت على وشك إدخال سلسلة فارغة. سيكون عليك استبدالها تمامًا بـ '' ، أو ستحصل على خطأ.

تعمل UNEX () على أي عمود ؛ لا داعي للقلق حول السلسلة الفارغة.

غالبًا ما تُستخدم الطرق السداسية باعتبارها هجمات

لاحظ أن هذا الأسلوب السداسي غالبًا ما يتم استخدامه كمهاجم حقن SQL حيث الأعداد الصحيحة تشبه السلاسل والفرار فقط مع mysql_real_escape_string . ثم يمكنك تجنب استخدام الاقتباسات.

على سبيل المثال ، إذا كنت تفعل شيء كهذا:

"SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])

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

SELECT ... WHERE id = -1 union all select table_name from information_schema.tables

والآن فقط استخراج هيكل الجدول:

SELECT ... WHERE id = -1 union all select column_name from information_schema.column where table_name = 0x61727469636c65

ثم اختر فقط البيانات التي تريدها. أليس هذا رائع؟

ولكن إذا كان المبرمج في موقع قابل للحقن عشريًا ، فلن يكون هناك أي حقن ممكنًا لأن الاستعلام سيبدو كما يلي: SELECT ... WHERE id = UNHEX('2d312075...3635')







sql ssis transform