查詢資料庫(Databases)名稱:
SELECT
name FROM master.dbo.sysdatabases
WHERE status
<> 512
查詢資料表(Tables)名稱:
SELECT
name FROM dbo.sysobjects
WHERE OBJECTPROPERTY(id,N'IsUserTable')
= 1 AND
name <> 'dtproperties'
查詢帶Schema 的資料表(Tables)名稱:
SELECT b.name
+ '.'
+ a.name AS
name FROM sysobjects a
INNER JOIN
sys.schemas b ON a.uid=b.schema_id
WHERE OBJECTPROPERTY(id,N'IsUserTable')
= 1 AND a.name
<> 'dtproperties'
說明:預設情況下Schema是dbo,資料表的名稱應該是dbo.TableName.但是有的資料表指定了其他的Schema.比如AdventureWorks 中的表HumanResources.Employee;Production.Product 等等.
查詢資料表(Tables)中的欄位(Columns)名稱:
SELECT
* FROM dbo.syscolumns
WHERE id=OBJECT_ID(N'[Production].[Product]')
ORDER BY colid
有的資料庫敏感大小寫,比如AdventureWorks.所以千萬要注意,表名稱,Schemas名稱要寫正確.我就是在我的一個程式裡面將dbo.sysobjects寫成dbo.Sysobjects(首字母大寫)而發生了錯誤.
PS:有關列舉區域網路內可用資料庫伺服器名稱的方法請參考我的另一篇日誌:
2010/05/28 added:
今天在公司的網路上DEBUG. 串連到一台SQL Server 2000.載入表名稱的時候出錯了.後來比對自己電腦上的SQL Server 2005.發現 2000沒有sys.schemas 這個視圖(View).(貌似連Schema的概念都沒有.抱歉,我在資料庫上面還是比較小白的.)後面嘗試多次,由於SQL Server 2005 的sysobjects中並沒有儲存諸如sys.schemas之類的視圖.多次嘗試之下,醜陋地完成了相容性問題:
BEGIN
IF EXISTS (SELECT uid FROM sysobjects where name='sysobjects')
SELECT b.name+'.'+a.name FROM sysobjects a INNER JOIN sysusers b ON a.uid=b.uid WHERE OBJECTPROPERTY(a.id,N'IsUserTable') = 1 AND a.name <> 'dtproperties'
ELSE
SELECT b.name+'.'+a.name FROM sysobjects a INNER JOIN sys.schemas b ON a.uid=b.schema_id WHERE OBJECTPROPERTY(a.id,N'IsUserTable') = 1 AND a.name <> 'dtproperties'
END