2010-05-07 94 views
1

奇怪的情况:我试图从我的代码中删除一些硬编码。有一种情况,我有一个字段,让我们说“CityID”,并使用这些信息,我想知道哪个表包含名为CityID的主键。动态确定在SQL服务器中给定字段名称的表名

从逻辑上讲,你可能会说它可能是一张名为“城市”的表格,但它不是......该表格被称为“城市”。数据库命名中还有一些不一致的地方,因此如果删除字符串“ID”并找出复数就足够了,我永远无法确定。

注意:一旦我发现CityID引用了一个名为Cities的表格,我将执行一个连接以将CityID替换为城市名称。如果有人能告诉我如何找到名字中的第一个varchar字段,我将不胜感激。

回答

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 
+0

我可以弄清楚该列是PK还是FK?目前它返回多个表格,因为〜30个表格将该字段作为FK,但只有一个将该字段作为PK。 – 2010-05-07 15:38:37

+0

@Salman A:为此我想你想看看'TABLE_CONSTRAINTS'和'CONSTRAINT_COLUMN_USAGE'(或者'KEY_COLUMN_USAGE')。这些观点在制定出什么地方的方面往往是相当可读的;看看我链接的文档。 – AakashM 2010-05-07 16:35:58

4
SELECT name FROM sysobjects 
WHERE id IN (SELECT id FROM syscolumns WHERE name = 'THE_COLUMN_NAME') 

从指定的表中获取列信息:从INFORMATION_SCHEMA.COLUMNS

SELECT column_name, data_type, character_maximum_length 
FROM information_schema.columns 
WHERE table_name = 'myTable' 
+0

好,查询1给了我多个表,因为不同的表有CityID为FK。是否有可能将它列为PK的表格。 – 2010-05-07 15:21:30

+1

为此,请参阅http://stackoverflow.com/questions/222217/how-do-i-determine-if-a-column-is-in-the-primary-key-of-its-table-sql-server – 2010-05-07 15:24:43

3

选择table_name的,其中列名= 'CityID'

2

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

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

对于什么是在INFORMAITON_SCHEMA底漆,看INFORMATION_SCHEMA, a map to your database