【问题标题】:Looping through a column in SQL table that contains names of other tables遍历 SQL 表中包含其他表名称的列
【发布时间】:2014-06-25 13:05:40
【问题描述】:

我对使用 SQL 相当陌生,目前我有一个表,其中有一列包含我想用于一个查询的所有表的名称,所以我想要做的是遍历该列并继续到这些表中的每一个,然后在它们的列之一中搜索一个值(可能有多个值),所以每当一个表包含该值时,我都会列出该表的名称。有人可以告诉我这是如何完成的吗?这需要光标吗?

【问题讨论】:

  • 您不必使用光标。例如,您将在其中一张表上运行的 select 语句是什么?
  • 从 _____(表名)中选择计数(批号)。我想确保该值存在,因此计数必须大于 0。但我必须对在主表列中具有其名称的每个表执行此操作。

标签: sql sql-server database sql-server-2008 sql-server-2008-r2


【解决方案1】:

我没有足够的声誉来发表评论,但表中包含表名的列是否都在一列中,这意味着所有表名都用逗号分隔或用某种分隔符标记?这会导致查询稍微复杂一些,因为您必须在开始循环遍历表之前处理好这个问题。 但是,这需要一个游标以及一些动态 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

由于时间限制的原因,我目前无法对此进行测试,但这就是我要做的事情。

【讨论】:

  • 谢谢,这和我现在写的差不多。我会告诉你它是否有效。
【解决方案2】:

你可以试试这样的:

--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”更改为您要查找的值,并可能添加一个 CONVERT/CAST 以确保该列是正确的数据类型?

您实际上说过您想要表的名称,因此您需要将 SQL 更改为:

'SELECT ''' + ts.TableName + ''' FROM ' + ts.TableName + ' WHERE ' + c.name + ' = 1;'

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

【讨论】:

  • 这只是我正在编写的长查询的一部分,它必须转换为 XML 输出,所以我还没有真正完成输出。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2018-06-11
  • 2015-03-01
  • 2013-07-26
  • 2018-11-03
  • 2021-09-15
  • 2023-02-20
  • 2012-04-21
相关资源
最近更新 更多