在SQL Server中实现几何列

时间:2013-11-19 04:22:44

标签: sql-server sql-server-2008 postgresql

postgres 中的geometry_columns看起来像(gis.stackexchange中的问题):

SELECT 
    current_database()::character varying(256) AS f_table_catalog, 
    n.nspname::character varying(256) AS f_table_schema, 
    c.relname::character varying(256) AS f_table_name, 
    a.attname::character varying(256) AS f_geometry_column, 
    COALESCE(NULLIF(postgis_typmod_dims(a.atttypmod), 2),postgis_constraint_dims(n.nspname::text, c.relname::text, a.attname::text), 2) AS coord_dimension, 
    COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod), 0), postgis_constraint_srid(n.nspname::text, c.relname::text, a.attname::text), 0) AS srid, 
    replace(replace(COALESCE(NULLIF(upper(postgis_typmod_type(a.atttypmod)), 'GEOMETRY'::text), postgis_constraint_type(n.nspname::text, c.relname::text, a.attname::text)::text, 'GEOMETRY'::text), 'ZM'::text, ''::text), 'Z'::text, ''::text)::character varying(30) AS type
FROM 
    pg_class c, pg_attribute a, pg_type t, pg_namespace n
WHERE 
    t.typname = 'geometry'::name 
    AND a.attisdropped = false 
    AND a.atttypid = t.oid 
    AND a.attrelid = c.oid 
    AND c.relnamespace = n.oid 
    AND (c.relkind = 'r'::"char" OR c.relkind = 'v'::"char") 
    AND NOT pg_is_other_temp_schema(c.relnamespace) 
    AND NOT (n.nspname = 'public'::name AND c.relname = 'raster_columns'::name) 
    AND has_table_privilege(c.oid, 'SELECT'::text);

我为SQL Server做的另一种选择是:

SELECT  
    c.TABLE_CATALOG
    ,c.TABLE_SCHEMA AS TABLE_SCHEMA
    ,c.TABLE_NAME AS TABLE_NAME
    ,c.COLUMN_NAME AS COLUMN_NAME   
FROM 
    information_schema.columns c
JOIN 
    information_schema.tables t ON c.TABLE_NAME = t.TABLE_NAME
                                AND t.TABLE_TYPE IN ('BASE TABLE','VIEW')
                                AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
WHERE 
    c.DATA_TYPE = 'geometry'

但它没有:

  • coord_dimension
  • srid
  • 类型

我知道SQL Server中获取上面列出的值的查询是:

SELECT distinct 
    @column_name.STDimension() as coord_dimension ,
    SP_GEOMETRY.STGeometryType() as srid,
    SP_GEOMETRY.STSrid 
FROM
    schema_name.@table_name

此查询需要通过表查询以查找不同的STDimension,因为单个表可以有多个维度。

如何将这两个查询合并到一个查询中,就像在postgres中一样?

注意:我想使用只查看他们有权访问的表,我认为查询Information_schema就足够了。我是对的吗?

1 个答案:

答案 0 :(得分:1)

我不能说postgres的实现,但这些属性不是SQL Server中列本身的属性。也就是说,该列没有SRID,但其中的各个数据都有。理论上,你可以有两行,每行都有不同SRID的地理数据(例如)。尺寸和几何类型也是如此。所以你要找的东西不能作为表模式的元数据查找;你必须看看数据本身。