Несколько записей в syscolumns для каждого столбца типа 'география' - PullRequest
3 голосов
/ 17 ноября 2011

Сначала я создал таблицу с именем Placemarks, содержащую столбец типа 'география'.

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 илиierarchyid.

Но я могу использовать тип данных геометрии в будущем и хочу, чтобы запрос был совместимым с прямым запросом.Есть еще идеи?

Ответы [ 2 ]

5 голосов
/ 17 ноября 2011

Дополнительные строки вводятся объединением на systypes.Изменение условия соединения на

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

, кажется, работает.Вы должны использовать sys.columns, sys.types и т. Д. Вместо устаревших syscolumns, systypes представлений обратной совместимости.

4 голосов
/ 17 ноября 2011

Я бы рекомендовал использовать более новые 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
...