在SQL Server中动态确定给定字段名称的表名

时间:2010-05-07 14:35:14

标签: sql sql-server sql-server-2000

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

从逻辑上讲,你可能会说它可能是一个名为“城市”的表,但它不是......那个表叫做“城市”。数据库命名中还有一些其他的不一致因此我永远无法确定是否删除字符串“ID”并找出复数就足够了。

注意:一旦我发现CityID引用了一个名为Cities的表,我将执行一个连接,以便动态地用城市名替换CityID。如果someonw还能告诉我如何在表中给出其名称的第一个varchar字段,我将不胜感激。

5 个答案:

答案 0 :(得分:4)

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'

答案 1 :(得分:3)

从information_schema.columns中选择table_name,其中column_name ='CityID'

答案 2 :(得分:2)

您可以使用INFORMATION_SCHEMA表来读取有关数据库的元数据。

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

有关INFORMAITON_SCHEMA中的内容的入门读物,请参阅INFORMATION_SCHEMA, a map to your database

答案 3 :(得分:1)

您所寻求的信息均可在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

答案 4 :(得分:0)

据您所知,您想查找包含主键中CITYID列的表

您可以使用SQL教程中所示的 sysindexes 和sysindexkeys之类的SQL Server系统视图来对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'