动态确定SQL server中给定字段名的表名
奇怪的情况:我试图从代码中删除一些硬编码。有一种情况是,我有一个字段,比如说“CityID”,利用这个信息,我想找出哪个表包含一个名为CityID的主键 从逻辑上讲,你会说它可能是一张叫做“城市”的桌子,但它不是。。。那张桌子叫做“城市”。数据库命名中还存在一些其他不一致之处,因此我永远无法确定删除字符串“ID”并找出复数是否足够 注意:一旦我发现CityID引用了一个名为Cities的表,我将执行一个join来动态地用city name替换CityID。如果someonw也能告诉我如何找到给定名称的表中的第一个varchar字段,我将不胜感激动态确定SQL server中给定字段名的表名,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,奇怪的情况:我试图从代码中删除一些硬编码。有一种情况是,我有一个字段,比如说“CityID”,利用这个信息,我想找出哪个表包含一个名为CityID的主键 从逻辑上讲,你会说它可能是一张叫做“城市”的桌子,但它不是。。。那张桌子叫做“城市”。数据库命名中还存在一些其他不一致之处,因此我永远无法确定删除字符串“ID”并找出复数是否足够 注意:一旦我发现CityID引用了一个名为Cities的表,我将执行一个join来动态地用city name替换CityID。如果someonw也能告诉我如何找到给定
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'
要从指定的表中获取列信息,请执行以下操作:
SELECT column_name, data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'myTable'
从信息模式中选择表名。列中的列从信息模式中选择表名。列中的列可以使用信息模式表读取有关数据库的元数据
SELECT
TABLE_NAME
FROM
[db].[INFORMATION_SCHEMA].[COLUMNS]
WHERE
COLUMN_NAME='CityID';
有关Informationon_架构中的内容的入门知识,请参见您可以使用Informationon_架构表来读取有关数据库的元数据
SELECT
TABLE_NAME
FROM
[db].[INFORMATION_SCHEMA].[COLUMNS]
WHERE
COLUMN_NAME='CityID';
有关信息模式中内容的入门知识,请参见您所查找的信息都可以在中找到。请注意,您会发现许多源代码告诉您如何直接查询这些视图所在的底层系统表——我必须承认,我也会这样做,只是为了快速找到一些东西——但建议应用程序使用这些视图 例如,要查找您的
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
您所寻求的信息都可以在中找到。请注意,您会发现许多源代码告诉您如何直接查询这些视图所在的底层系统表——我必须承认,我也会这样做,只是为了快速找到一些东西——但建议应用程序使用这些视图 例如,要查找您的
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
我从您的问题中了解到,您希望查找主键中包含CITYID列的表 可以使用SQL教程中所示的SQL Server系统视图(如sysindex和sysindexkeys)来包含所形成的索引
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'
我从您的问题中了解到,您希望查找主键中包含CITYID列的表 可以使用SQL教程中所示的SQL Server系统视图(如sysindex和sysindexkeys)来包含所形成的索引
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'
很好,查询1提供了多个表,因为各个表都将CityID作为FK。是否有可能将作为PK的表列入短名单。为此,请参见“好”,查询1提供了多个表,因为各个表都将CityID作为FK。是否有可能将具有PK的表列入短名单。为此,请参阅我是否可以确定该列是PK还是FK?目前,它返回多个表,因为大约有30个表将此字段作为FK,但只有一个表将此字段作为PK。@Salman A:为此,我认为您需要查看
表的约束
和约束列的使用情况
(或者键列的使用情况
)。这些观点倾向于在解决问题方面具有相当的可读性;请看一下我链接的文档。我可以确定该列是PK还是FK吗?目前,它返回多个表,因为大约有30个表将此字段作为FK,但只有一个表将此字段作为PK。@Salman A:为此,我认为您需要查看表的约束
和约束列的使用情况
(或者键列的使用情况
)。这些观点倾向于在解决问题方面具有相当的可读性;看看我链接的文档。