إدخال القيم الافتراضية والأعمدة المحسوبة

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

  •  24-09-2019
  •  | 
  •  

سؤال

بالنسبة لمكتبة Perl التي تتفق مخططات Sybase لـ DBIX :: Class (:: Schema :: Loader) ، يجب أن أكون قادرًا على استخدام الإعدادات الافتراضية والأعمدة المحسوبة.

لنفترض أن لدينا:

create table bar (
  id INTEGER IDENTITY PRIMARY KEY,
  foo VARCHAR(10) DEFAULT 'foo',
  adt AS getdate(),
  ts timestamp
)

هنا بقدر ما حصلت عليه:

select substring(c.name,1,5) name, c.cdefault, c.computedcol from syscolumns c
join sysobjects o on c.id = o.id where o.name = 'bar' and o.type = 'U'

name       cdefault    computedcol 
---------- ----------- ----------- 
id                   0        NULL 
foo          602182610        NULL 
adt                  0   618182667 
ts                   0        NULL 

هذا يخبرني أن العمود "FOO" لديه إجراء مخزن مع ID 602182610 الذي يعيد القيمة. كيف يمكنني الحصول على الافتراضي الأصلي "foo" من هذا المعرف؟

لا يحتوي عمود الطوابع الزمنية على كائن عمود محسّن ولا Sproc افتراضي ، لكنني بحاجة بطريقة ما إلى معرفة أنه في الواقع عمود طابع زمني. إن النظر إلى نوع البيانات الذي تم إرجاعه بواسطة DBI لأنه يخبرني أنه "varbinary" ، وهو التمثيل الداخلي لجهاز الطابع الزمني. كيف أعرف ما إذا كان ذلك أم لا؟

يخبرني أيضًا أن العمود "ADT" هو عمود محسوب ، كائن لهذا العمود يحتوي على معرف 618182667.

إن النظر إلى sysobjects لهذا المعرف يخبرني القليل الذي يبدو أنه مفيد باستثناء:

select substring(name,1,15) name, type from sysobjects where id = 618182667

name                           type 
------------------------------ ---- 
bar_adt_6181826                C    

أي مساعدة موضع تقدير كبير.

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

المحلول

بخصوص سؤالك الأول ، حول التخلف عن السداد

select text from syscomments 
where id = 602182610

أما بالنسبة لأعمدة الطابع الزمني ، فإن type عمود في المراجع Syscolumns systypes.type. في هذا الجدول name يحتوي العمود على اسم نوع البيانات.

نصائح أخرى

هذا هو الاستعلام الذي انتهى به الأمر في حالة اهتمام أي شخص:

SELECT c.name name, t.name type, cm.text deflt
FROM syscolumns c         
JOIN sysobjects o ON c.id = o.id
LEFT JOIN systypes t ON c.type = t.type AND c.usertype = t.usertype
LEFT JOIN syscomments cm  
  ON cm.id = CASE WHEN c.cdefault = 0 THEN c.computedcol ELSE c.cdefault END
WHERE o.name = 'table_name' AND o.type = 'U'

يبدو أنه يعمل بشكل جيد ، على الرغم من أنني ما زلت بحاجة إلى كتابة المزيد من اختبارات نوع البيانات :)

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