Sql 在数据库中查找表
在Microsoft SQL Server中 我需要找到列名和表名所在的数据库和服务器 我知道一个表名、列名Sql 在数据库中查找表,sql,sql-server,tsql,Sql,Sql Server,Tsql,在Microsoft SQL Server中 我需要找到列名和表名所在的数据库和服务器 我知道一个表名、列名 如何找到表和列所在的数据库?只指定列名 SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name, c.name AS column_name FROM sys.tables AS t INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID WHERE c.n
如何找到表和列所在的数据库?只指定列名
SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%Column_Name%'
ORDER BY schema_name, table_name;
在SqlServer中,如果存在表和列,则此查询将返回一行
select * from sysobjects T
JOIN syscolumns C ON T.id = C.id
where c.name = 'COLUMNNAME' and t.name = 'TABLENAME'
您需要遍历所有数据库才能执行此操作:
IF OBJECT_ID('tempdb..#DBNames', 'U') IS NOT NULL
DROP TABLE #DBNames
Create Table #DBNames (
DBName varchar(256)
)
Insert #DBNames
Select name
From sys.databases
Where owner_sid <> 1
Declare @DBName nvarchar(256)
,@TableName nvarchar(256)
,@ColumnName nvarchar(256)
,@sql nvarchar(2000)
Select @TableName = 'YourTableName'
,@ColumnName = 'YourColumnName'
Declare SearchForDBTable Cursor For
Select DBName
From #DBNames
Open SearchForDBTable
Fetch Next From SearchForDBTable Into @DBName
While @@FETCH_STATUS = 0
Begin
Set @sql = 'Select @DBName DBName
,t.name TableName
,c.name ColumnName
From sys.tables t
join sys.columns c
on t.object_id = c.object_id
Where t.name = @TableName
And c.name = @ColumnName'
exec sp_executesql @sql
,N'@DBName varchar(256), @TableName varchar(256), @ColumnName varchar(256)'
,@DBName = @DBName
,@TableName = @TableName
,@ColumnName = @ColumnName
Fetch Next From SearchForDBTable Into @DBName
End
Close SearchForDBTable
Deallocate SearchForDBTable
这里有一个方法。从查询开始,确定当前选定的数据库中是否存在tabe.column:
SELECT db_name()
from sys.tables ta
inner join sys.columns co
on co.object_id = ta.object_id
where ta.name = 'Users'
and co.name = 'CreatedOn'
将其转换为仅在找到时生成结果的例程:
IF exists (select 1
from sys.tables ta
inner join sys.columns co
on co.object_id = ta.object_id
where ta.name = 'Users'
and co.name = 'CreatedOn')
PRINT db_name()
然后将其插入未记录但非常有用的系统程序sp_msForEachDB:
这将打印出实例上包含此表和列的每个数据库的名称。这里有另一种使用信息模式的方法。您可以扩展select语句中的内容,但基本内容如下所示。从SQLServer2005开始,我就一直在使用类似的脚本,这是刚刚使用SQLServer2012编写的
DECLARE @somecolumn VARCHAR(155) = 'name'
SELECT t.TABLE_CATALOG, t.TABLE_NAME, c.Column_name, c.ORDINAL_Position
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME AND c.COLUMN_NAME = @somecolumn
WHERE t.TABLE_TYPE = 'BASE TABLE'
看看你连接到哪个数据库的查询是有效的?我们谈论的是哪个sql server,MySQL,MSSQL,Oracle?我们需要更多的细节来给你最好的建议,你在看什么?是否有一段代码,或者您正在查看某种数据库浏览器?多个服务器/数据库可能具有相同的表名和列名。您试图解决的问题是什么?在Microsoft SQL server中,用户不知道它在哪个数据库中,所以是哪个sysobjects?@KyleHale如前所述,用户甚至不知道是哪个服务器。这样做了,但我建议使用sp_msForEachDB,所有的数据库游标循环都是这样做的。不需要游标或循环:只需使用sp_msforeachdb。对PhilipSure挥拳,但它没有文档记录,并且有它的问题。@DaveJohnson您是100%正确的,先生。大量的SQL专家已经做了很多测试,表明这可能会丢失整个数据库,并可能会锁定您的服务器。使用msForEachDB时要非常小心。
DECLARE @somecolumn VARCHAR(155) = 'name'
SELECT t.TABLE_CATALOG, t.TABLE_NAME, c.Column_name, c.ORDINAL_Position
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME AND c.COLUMN_NAME = @somecolumn
WHERE t.TABLE_TYPE = 'BASE TABLE'