首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历SQL表中包含其他表名称的列

问循环遍历SQL表中包含其他表名称的列
EN

Stack Overflow用户
提问于 2014-06-25 21:05:40
回答 2查看 1.3K关注 0票数 0

我刚开始使用SQL,目前我有一个表,其中有一列包含我要用于一个查询的所有表的名称,所以我想要做的是循环遍历该列,转到这些表中的每个表,然后在它们的一列中搜索一个值(可能有多个值),所以每当一个表包含该值时,我都会列出该表的名称。有人能给我一点提示吗?这是怎么做的?这需要游标吗?

EN

回答 2

Stack Overflow用户

发布于 2014-06-25 21:38:09

我没有足够的名气来评论,但是包含表名的列的表是否都在一列中,这意味着所有的表名都是用逗号分隔的或用某种分隔符标记的?这将导致查询稍微复杂一些,因为在开始遍历表之前,您必须注意这一点。但是,这将需要一个游标,以及一些动态sql。我将给出一个基本的例子来说明如何去做这件事。

代码语言:javascript
复制
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

由于时间限制,我目前无法对此进行测试,但以下是我将如何进行测试的方法。

票数 1
EN

Stack Overflow用户

发布于 2014-06-25 21:36:29

您可以尝试如下所示:

代码语言:javascript
复制
--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更改为:

代码语言:javascript
复制
'SELECT ''' + ts.TableName + ''' FROM ' + ts.TableName + ' WHERE ' + c.name + ' = 1;'

另一种想法是,最好将结果插入到临时表中,这样您就可以在结束时一次性输出结果?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24409519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档