1

テーブル情報にテーブル名を付けて取得しようとしているので、次のようなクエリを作成しました。

 SELECT so.name, sc.name, st.name, sc.length, CASE WHEN sc.status = 0x80 THEN 'Y' ELSE 'N' END AS IsIdent, ColOrder
   FROM Asdim.dbo.sysobjects so
   INNER JOIN Asdim.dbo.syscolumns sc
   ON so.id=  sc.id
   INNER JOIN Asdim.dbo.systypes st
   ON sc.xtype = st.xusertype
   WHERE so.Name = 'Admin'

問題は、「Admin」という名前のテーブルが2つあるのに、スキーマが異なることです。したがって、このクエリを実行すると、次のようになります。

SELECT * FROM Asdim.dbo.sysobjects WHERE name LIKE 'Admin'

テーブル名が同じであるため、2つのレコードを取得します。スキーマ名に基づいてフィルターで除外する方法はありますか?

4

1 に答える 1

1

The views you are using are all deprecated and just supplied for backward compatibility. Using the new views gives.

SELECT t.name,
       c.name,
       ty.name,
       c.is_identity,
       c.max_length,
       c.column_id
FROM sys.tables t
JOIN sys.schemas s ON s.schema_id=t.schema_id
JOIN sys.columns c ON c.object_id = t.object_id
JOIN sys.types ty ON ty.user_type_id = c.user_type_id
WHERE t.name LIKE '%Admin%' AND s.name = 'dbo'

INFORMATION_SCHEMA.COLUMNS has nearly all the information you need but is missing info about identity columns.

于 2011-10-07T16:00:01.837 に答える