动态确定在SQL服务器中给定字段名称的表名
奇怪的情况:我试图从我的代码中删除一些硬编码。有一种情况,我有一个字段,让我们说“CityID”,并使用这些信息,我想知道哪个表包含名为CityID的主键。动态确定在SQL服务器中给定字段名称的表名
从逻辑上讲,你可能会说它可能是一张名为“城市”的表格,但它不是......该表格被称为“城市”。数据库命名中还有一些不一致的地方,因此如果删除字符串“ID”并找出复数就足够了,我永远无法确定。
注意:一旦我发现CityID引用了一个名为Cities的表格,我将执行一个连接以将CityID替换为城市名称。如果有人能告诉我如何找到名字中的第一个varchar字段,我将不胜感激。
你所寻求的信息是在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
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'
好,查询1给了我多个表,因为不同的表有CityID为FK。是否有可能将它列为PK的表格。 – 2010-05-07 15:21:30
为此,请参阅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
选择table_name的,其中列名= 'CityID'
可以使用INFORMATION_SCHEMA表来读取有关的元数据数据库。
SELECT
TABLE_NAME
FROM
[db].[INFORMATION_SCHEMA].[COLUMNS]
WHERE
COLUMN_NAME='CityID';
对于什么是在INFORMAITON_SCHEMA底漆,看INFORMATION_SCHEMA, a map to your database
我可以弄清楚该列是PK还是FK?目前它返回多个表格,因为〜30个表格将该字段作为FK,但只有一个将该字段作为PK。 – 2010-05-07 15:38:37
@Salman A:为此我想你想看看'TABLE_CONSTRAINTS'和'CONSTRAINT_COLUMN_USAGE'(或者'KEY_COLUMN_USAGE')。这些观点在制定出什么地方的方面往往是相当可读的;看看我链接的文档。 – AakashM 2010-05-07 16:35:58