我刚开始使用SQL,目前我有一个表,其中有一列包含我要用于一个查询的所有表的名称,所以我想要做的是循环遍历该列,转到这些表中的每个表,然后在它们的一列中搜索一个值(可能有多个值),所以每当一个表包含该值时,我都会列出该表的名称。有人能给我一点提示吗?这是怎么做的?这需要游标吗?
发布于 2014-06-25 21:38:09
我没有足够的名气来评论,但是包含表名的列的表是否都在一列中,这意味着所有的表名都是用逗号分隔的或用某种分隔符标记的?这将导致查询稍微复杂一些,因为在开始遍历表之前,您必须注意这一点。但是,这将需要一个游标,以及一些动态sql。我将给出一个基本的例子来说明如何去做这件事。
declare @value varchar(50)
declare @tableName varchar(50)
declare @sqlstring nvarchar(100)
set @value = 'whateveryouwant'
declare @getTableName = cursor for
select tableName from TablewithTableNames
OPEN @getTableName
fetch NEXT
from @getTableName into @tableName
while @@FETCH_STATUS = 0
BEGIN
set @sqlstring = 'Select Count(*) from ' + @tableName + 'where ColumnNameYouwant = ' + @value
exec @sqlstring
If @@ROWcount > 0
insert into #temptable values (@tableName)
fetch next
from @getTableName into @tableName
END
select * from #temptable
drop table #temptable
close @getTableName
deallocate @getTableName由于时间限制,我目前无法对此进行测试,但以下是我将如何进行测试的方法。
发布于 2014-06-25 21:36:29
您可以尝试如下所示:
--Generate dynamic SQL
DECLARE @TablesToSearch TABLE (
TableName VARCHAR(50));
INSERT INTO @TablesToSearch VALUES ('invoiceTbl');
DECLARE @SQL TABLE (
RowNum INT,
SQLText VARCHAR(500));
INSERT INTO
@SQL
SELECT
ROW_NUMBER() OVER (ORDER BY ts.TableName) AS RowNum,
'SELECT * FROM ' + ts.TableName + ' WHERE ' + c.name + ' = 1;'
FROM
@TablesToSearch ts
INNER JOIN sys.tables t ON t.name = ts.TableName
INNER JOIN sys.columns c ON c.object_id = t.object_id;
--Now run the queries
DECLARE @Count INT;
SELECT @Count = COUNT(*) FROM @SQL;
WHILE @Count > 0
BEGIN
DECLARE @RowNum INT;
DECLARE @SQLText VARCHAR(500);
SELECT TOP 1 @RowNum = RowNum, @SQLText = SQLText FROM @SQL;
EXEC (@SQLText);
DELETE FROM @SQL WHERE RowNum = @RowNum;
SELECT @Count = COUNT(*) FROM @SQL;
END;您需要将我用作示例的"1“更改为您正在查找的值,并可能添加一个转换/强制转换以确保该列是正确的数据类型?
实际上,您想要的是表的名称,因此需要将SQL更改为:
'SELECT ''' + ts.TableName + ''' FROM ' + ts.TableName + ' WHERE ' + c.name + ' = 1;'另一种想法是,最好将结果插入到临时表中,这样您就可以在结束时一次性输出结果?
https://stackoverflow.com/questions/24409519
复制相似问题