代码之家  ›  专栏  ›  技术社区  ›  Salman Arshad

在sql server中动态确定给定字段名的表名

  •  1
  • Salman Arshad  · 技术社区  · 15 年前

    奇怪的情况:我试图从代码中删除一些硬编码。有一种情况,我有一个字段,比如说“cityid”,使用这个信息,我想找出哪个表包含一个名为cityid的主键。

    逻辑上,你会说这可能是一张叫做“城市”的桌子,但它不是…那张桌子叫做“城市”。数据库命名中还有其他一些不一致之处,因此我永远无法确定删除字符串“id”并找出复数是否足够。

    注意:一旦我发现cityid引用了一个名为cities的表,我将执行一个join以动态地将cityid替换为city name。如果someonw也能告诉我如何查找给定名称的表中的第一个varchar字段,我将不胜感激。

    5 回复  |  直到 6 年前
        1
  •  1
  •   AakashM    15 年前

    你要找的信息都在 information schema views . 请注意,您将发现许多资源告诉您如何直接查询这些视图所在的底层系统表—我必须承认,当只是为了快速查找某些内容时,我也会这样做—但对于应用程序,推荐的方法是查看这些视图。

    例如,要找到 CityID 列:

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'CityID'
    

    找到第一个 varchar 表中的字段:

    SELECT TOP 1 * FROM INFORMATION_SCHEMA.COLUMNS WHERE
        TABLE_NAME = 'TableName'
        AND DATA_TYPE = 'varchar'    -- This is off the top of my head!
    ORDER BY ORDINAL_POSITION
    
        2
  •  4
  •   Robert Harvey    15 年前
    SELECT name FROM sysobjects 
    WHERE id IN ( SELECT id FROM syscolumns WHERE name = 'THE_COLUMN_NAME' )
    

    要从指定表中获取列信息,请执行以下操作:

    SELECT column_name, data_type, character_maximum_length 
    FROM information_schema.columns
    WHERE table_name = 'myTable'
    
        3
  •  3
  •   Wudang    15 年前

    从information\u schema.columns中选择table\u name,其中column\u name='cityid'

        4
  •  2
  •   mdma    15 年前

    可以使用信息架构表读取有关数据库的元数据。

    SELECT 
         TABLE_NAME 
    FROM 
         [db].[INFORMATION_SCHEMA].[COLUMNS]
    WHERE 
         COLUMN_NAME='CityID';
    

    有关信息架构中的内容的入门知识,请参见 INFORMATION_SCHEMA, a map to your database

        5
  •  0
  •   Eralper    6 年前

    我从您的问题中了解到,您希望在主键中找到包含cityid列的表

    您可以使用SQL Server系统视图,如 系统索引 和sysindexkeys,如 query database table primary keys 包括 composite primary keys 形成的

    SELECT
      TBL.name as TableName
    FROM sysobjects as PK
    INNER JOIN sys.objects as TBL
      on TBL.object_id = PK.parent_obj
    INNER JOIN sysindexes as IND
      on IND.name = PK.name AND
      IND.id = TBL.object_id
    INNER JOIN SysIndexKeys as KEYS
      on KEYS.id = IND.id AND
      KEYS.indid = IND.indid
    INNER JOIN syscolumns as COL
      on COL.id = KEYS.id AND
      COL.colid = KEYS.colid
    WHERE
      PK.xtype = 'PK' AND
      COL.name = 'CityID'