2011-11-17 30 views
3

首先,我創建了一個名爲Placemarks的表,其中包含「地理」類型的列。「地理」類型的每列中的syscolumns中的多個條目

CREATE TABLE [dbo].[Placemarks](
[ID] [int] NOT NULL, 
[Name] [nvarchar](50) NOT NULL, 
[Location] [geography] NOT NULL, 
CONSTRAINT [PK_Placemarks] 
    PRIMARY KEY CLUSTERED([ID] ASC) 
) 

然後,我在存儲過程中使用以下查詢來獲取表中所有列的數據類型列表。

SELECT 
    b.name, c.name as TypeName, b.length, b.isnullable, b.collation, b.xprec, b.xscale 
FROM sysobjects a 
inner join syscolumns b on a.id = b.id 
inner join systypes c on b.xtype = c.xtype and c.name <> 'sysname' 
WHERE a.id = object_id(N'[dbo].[Placemarks]') 
and OBJECTPROPERTY(a.id, N'IsUserTable') = 1 
ORDER BY b.colId 

查詢的結果可以看這裏:

Query results

我使用在存儲過程中該查詢,需要得到每個列單行我Placemarks表。我可以用TypeName = geometry或hierarchyid過濾出行。

但我可能會在將來使用幾何數據類型,並希望查詢向前兼容。任何其他想法?

回答

4

我會建議使用較新的sys系統目錄視圖而不是舊的sysobjects和類似的視圖 - 這些將很快被刪除。

有了這個查詢,你應該得到你想要的結果:

SELECT 
    c.name 'ColName', 
    ty.Name 'TypeName', 
    c.max_length, c.is_nullable, c.collation_name, c.precision, c.scale 
FROM 
    sys.tables t 
INNER JOIN 
    sys.columns c ON t.object_id = c.object_id 
INNER JOIN 
    sys.types ty ON c.user_type_id = ty.user_type_id 
WHERE 
    t.name = 'Placemarks' 

至少在我的情況,我現在得到:

ColName TypeName max_length is_nullable collation_name precision scale 
ID  int   4   0  NULL    10  0 
Name  nvarchar 100   0  Latin1_General_CI_AS 0  0 
Location geography -1   0  NULL     0  0 
5

附加行由systypes上的連接引入。改變連接條件爲

inner join systypes c on b.xtype = c.xtype and b.xusertype=c.xusertype 

似乎工作。您應該使用sys.columns, sys.types等代替已棄用的syscolumns, systypes向後兼容性視圖。

相關問題