4

DBIx::Class (::Schema::Loader) の Sybase スキーマをダンプする Perl ライブラリの場合、DEFAULT と計算カラムをイントロスペクトできる必要があります。

次があるとします。

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 のストアド プロシージャがあることを示しています。この ID から元の DEFAULT 'foo' を取得するにはどうすればよいですか?

タイムスタンプ列には、計算された列オブジェクトもデフォルトの sproc もありませんが、実際にはタイムスタンプ列であることを何とか知る必要があります。DBI から返されたデータ型を見ると、タイムスタンプの内部表現である「varbinary」であることがわかります。それがそうであるかそうでないかをどうやって知ることができますか?

また、列「adt」が計算列であり、この列のオブジェクトの ID が 618182667 であることもわかります。

その ID の sysobjects を調べると、次の点を除いて、有用と思われることはほとんどわかりません。

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

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

どんな助けでも大歓迎です。

4

3 に答える 3

6

これは、誰かが興味を持っている場合に備えて、私が最終的に使用したクエリです。

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'

うまくいくようですが、データ型のテストをもう少し書く必要があります :)

于 2010-01-31T14:36:55.820 に答える
2

最初の質問について、デフォルトについて

select text from syscomments 
where id = 602182610

タイムスタンプ列についてはtype、syscolumns の列が を参照しsystypes.typeます。そのテーブルのname列には、データ型名が含まれています。

于 2010-01-31T08:59:56.153 に答える