مفصل SQL Server 'encoding' sproc - هناك أكثر من طريقة للقيام بذلك ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أتساءل فقط إذا كان هناك طريقة أفضل للقيام بذلك في SQL Server 2005.

على نحو فعال, أنا أخذ originator_id (رقم بين 0 و 99) و 'next_element' (انها حقا مجرد متتابعة مواجهة بين 1 و 999,999).نحن نحاول خلق 6-حرف 'كود' من لهم.

على originator_id هو ضرب من مليون ثم العداد وأضاف في إعطائنا رقم بين 0 و 99,999,999.

ثم نقوم بتحويل هذا في الأساس '32' سلسلة وهمية قاعدة 32, أين نحن حقا فقط باستخدام 0-9 و A-Z ولكن مع عدد قليل من أكثر مربكة alphanums إزالة الوضوح (I, O, S, Z).

للقيام بذلك, نحن فقط تقسيم عدد من قبل سلطات 32 ، في كل مرحلة باستخدام والنتيجة نحصل على كل السلطة فهرس حرف من لدينا مجموعة من الحرف المحدد.

Thus, an originator ID of 61 and NextCodeElement of 9 gives a code of '1T5JA9'

(61 * 1,000,000) + 9 = 61,000,009
61,000,009 div (5^32 = 33,554,432) =  1 = '1'
27,445,577 div (4^32 =  1,048,576) = 26 = 'T'
   182,601 div (3^32 =     32,768) =  5 = '5'
    18,761 div (2^32 =      1,024) = 18 = 'J'
       329 div (1^32 =         32) = 10 = 'A'
         9 div (0^32 =          1) =  9 = '9'

so my code is 1T5JA9

سابقا كان لدي هذه الخوارزمية تعمل (في دلفي) ولكن الآن أنا حقا بحاجة إلى أن تكون قادرة على إعادة ذلك في SQL Server 2005.من الواضح أنني لا يكون تماما نفس وظائف اليد التي لدي في دلفي, ولكن هذا هو بلدي يأخذ على الروتين.يعمل, أنا يمكن أن تولد رموز (أو إعادة بناء رموز العودة إلى مكوناتها) على ما يرام.

ولكن يبدو قليلا مهزار ، وأنا لست متأكدا من أن الحيلة اختيار نتيجة الانقسام إلى int (أي صب عليه حقا) هو بالضرورة " حق " - هل هناك أفضل SQLS نهج هذا النوع من شيء ؟

CREATE procedure dummy_RP_CREATE_CODE @NextCodeElement int, @OriginatorID int,
  @code varchar(6) output
as
begin
  declare @raw_num int;
  declare @bcelems char(32);
  declare @chr int;

  select @bcelems='0123456789ABCDEFGHJKLMNPQRTUVWXY';
  select @code='';

  -- add in the originator_id, scaled into place
  select @raw_num = (@OriginatorID * 1000000) + @NextCodeElement;

  -- now to convert this to a 6-char code

  -- 5^32
  select @chr = @raw_num / 33554432;
  select @raw_num = @raw_num - (@chr * 33554432);
  select @code = @code + SUBSTRING(@bcelems, 1 + @chr, 1);

  -- 4^32
  select @chr = @raw_num / 1048576;
  select @raw_num = @raw_num - (@chr * 1048576);
  select @code = @code + SUBSTRING(@bcelems, 1 + @chr, 1);

  -- 3^32
  select @chr = @raw_num / 32768;
  select @raw_num = @raw_num - (@chr * 32768);
  select @code = @code + SUBSTRING(@bcelems, 1 + @chr, 1);

  -- 2^32
  select @chr = @raw_num / 1024;
  select @raw_num = @raw_num - (@chr * 1024);
  select @code = @code + SUBSTRING(@bcelems, 1 + @chr, 1);

  -- 1^32
  select @chr = @raw_num / 32;
  select @raw_num = @raw_num - (@chr * 32);
  select @code = @code + SUBSTRING(@bcelems, 1 + @chr, 1);

  -- 0^32  
  select @code = @code + SUBSTRING(@bcelems, 1 + @raw_num, 1);

  -- that's it!
end;

أنا لست يائسا قلقا حول الأمثل إلا إذا كان هذا الأسلوب هو في الواقع أمر من حجم (أو نحو ذلك) أسوأ من أي بديل.

رمز فقط من أي وقت مضى يحصل على تنفيذها في رشقات نارية صغيرة ربما توليد 20 أو 30 رموز كل 10 دقائق أو نحو ذلك.بسبب مجموعة كبيرة من الأرقام لا أريد أن قبل حساب رموز إلى طاولة كبيرة (إلا جيوب صغيرة من القانون العام في أي وقت التثبيت).

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

أي نقد بناء ملاحظات أو اقتراحات أن يكون موضع ترحيب.

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

المحلول

كما نرى انها SQL Server 2005 أي سبب لعدم استخدام CLR المخزنة الإجراء ؟ يمكنك استخدام الخاص بك CLR اللغة من خيار ثم ربما سيكون نسبيا ميناء مباشر من القائمة الخاصة بك دلفي رمز.

نصائح أخرى

على الرغم من أنه يمكن أن يتم في SQL Server 2005 ، أعتقد أنه من كافية غير قاعدة البيانات نيس هذا نوع من precompiled, لغة عالية المستوى الروتيني makese معنى.

لقد كتبت دلس عن ينترباسي/فايربيرد و T-SQL sprocs ل SQL Server ، ولكن أبدا CLR الروتينية.سيكون ممارسة مثيرة للاهتمام!

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