2011-11-17 3 views
3

먼저 'geography'유형의 열을 포함하는 Placemarks 테이블을 작성했습니다.'geography'유형의 각 열에 대한 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 

쿼리의 결과는 여기에서 볼 수 있습니다 : 내가 저장 프로 시저에서이 쿼리를 사용하여 내 Placemarks 테이블의 각 열에 대한 하나의 행을 얻을 필요하고

Query results

. TypeName = geometry 또는 hierarchyid로 행을 필터링 할 수 있습니다.

하지만 앞으로는 기하학 데이터 형식을 사용할 수 있으며 쿼리가 앞으로 호환되도록 할 수 있습니다. 다른 아이디어?

답변

4

이전의 sysobjects 및 유사한보기가 아닌 새로운 sys 시스템 카탈로그보기를 사용하는 것이 좋습니다 - 곧 제거 될 것입니다.

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 

으로 변경하는 것 같습니다. 더 이상 사용되지 않는 syscolumns, systypes 이전 버전과의 호환성보기 대신 sys.columns, sys.types 등을 사용해야합니다.

관련 문제