我的目标是从具有特定值的给定列的数据库中查找所有表。 即 我有表1,表2,表3,表4,表5,表6,表7等表。
在这些表中,某些表的列名为“NameID”。现在我想找出列名为'NameID'且值为100的表。
任何人都可以告诉我如何编写SQL查询吗?
答案 0 :(得分:1)
是的,您可以使用INFORMATION_SCHEMA,它允许MS SQL自我描述。
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'NameID'
答案 1 :(得分:0)
如果您无法列出表格,我怀疑您是否可以在查询中执行此操作。您需要动态创建一个查询(使用您发现的表格,如Paul Alan Taylor所示)。
尝试改编:
http://ubercode.bleakllc.com/2008/11/find-any-value-in-any-database-column.html
如果您已经知道所有包含该列的表,并且该表列表不会更改,那么您可以执行一个简单的查询,如
Select 'Table1' from table1 where id = 100
UNION
Select 'Table2' from table2 where id = 100
UNION
...
UNION会丢弃所有的欺骗行为,所以如果多行的id为100,那么你只需要列出一次表,如果这不是你想要的UNION ALL。
答案 2 :(得分:0)
需要做类似的事情,对我们来说是TransactionID。我拿了Paul Alan Taylor和MakeMinePanacea的建议并添加了一个光标。它快速而肮脏,但适用于1次。
DECLARE @TableName varchar(MAX)
DECLARE @Sql VARCHAR(MAX)
set @Sql = ''
DECLARE @Tables CURSOR
SET @Tables = CURSOR FOR
SELECT t.Table_Name
FROM INFORMATION_SCHEMA.COLUMNS c
JOIN INFORMATION_SCHEMA.TABLES t on c.Table_Name = t.Table_Name
WHERE COLUMN_NAME = 'TransactionID' and table_type = 'BASE TABLE'
OPEN @Tables
FETCH NEXT
FROM @Tables INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
if len(@Sql) > 0
BEGIN
set @SQL = @SQL + ' UNION ALL '
END
set @Sql = @Sql + 'SELECT ''' + @TableName + ''' FROM [' + @TableName + '] WHERE transactionid = 100'
FETCH NEXT
FROM @Tables INTO @TableName
END
CLOSE @Tables
DEALLOCATE @Tables
exec (@Sql)
答案 3 :(得分:0)
您可以将我的搜索脚本与以下参数一起使用:
SET @SearchStrColumnValue = '100' /* use LIKE syntax */
SET @FullRowResult = 1
SET @SearchStrTableName = 'TABLE%' /* NULL for all tables, uses LIKE syntax */
SET @SearchStrColumnName = 'NameID' /* NULL for all columns, uses LIKE syntax */
SET @SearchStrInXML = 0 /* Searching XML data may be slow */
http://fullparam.wordpress.com/2012/09/07/fck-it-i-am-going-to-search-all-tables-all-collumns/