【问题标题】:How to pass table name as parameter in select statement in SQL Sever如何在 SQL Server 的 select 语句中将表名作为参数传递
【发布时间】:2017-10-11 12:02:42
【问题描述】:

表:

Col 
------
Table1 
table2 
table3

查询:

select count(*) 
from @tablename

我想在选择查询中将table1table2table3 作为@tablename 的参数传递并获取每个表的计数

期望的输出:

 2 (table 1 count)  3 (table 2 count)  4 (table 3 count)

【问题讨论】:

  • 如果要对表名进行参数化,需要使用动态SQL。
  • 您希望您的输出在所有一行中,还是其他人编辑的结果?
  • 对于行计数,这可能没问题,但如果对这些表有任何其他“常见”查询,这可能是数据模型损坏的迹象。如果您正在执行“常见”查询,它们实际上很可能应该是一个表,并且应该建模为 data 的东西也可能最终变成(不太可查询)元数据,比如嵌入到表name中。

标签: sql sql-server sql-server-2008 count


【解决方案1】:

您可以使用动态 sql 和游标来运行它们:

为测试创建临时表:

DECLARE @tablenametable TABLE(tablename VARCHAR(100));
INSERT INTO @tablenametable
VALUES('table1'), ('table2'), ('table3');

使用游标遍历表中的所有表名

DECLARE @tablename VARCHAR(100);
DECLARE dbcursor CURSOR
FOR
    SELECT tablename
    FROM @tablenametable;
OPEN dbcursor;
FETCH NEXT FROM dbcursor INTO @tablename;
WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @sql VARCHAR(MAX);
        SET @sql = 'select count(*) from '+@tablename;
        PRINT(@sql);
        FETCH NEXT FROM dbcursor INTO @tablename;
    END;
CLOSE dbcursor;
DEALLOCATE dbcursor;

给出以下结果:

select count(*) from table1
select count(*) from table2
select count(*) from table3

如果您满意,只需将PRINT(@SQL) 更改为EXEC(@SQL)

【讨论】:

    【解决方案2】:

    您可以使用动态 sql 查询。

    查询

    declare @sql as varchar(max);
    
    select @sql = stuff((
        select ' union all '
        + 'select cast(count(*) as varchar(100)) 
        + ' + char(39) + '(' + [Col] +' Count)' + char(39) 
        + ' as [table_counts] '
        + ' from ' + [col]
        from [your_table_name]
        for xml path('')
      )
      , 1, 11, ''
    );
    
    exec(@sql);
    

    Find a demo here

    【讨论】:

      【解决方案3】:

      正如这里提到的,你必须使用动态 SQL。

      第一种方法是您自己指定表名:

      declare @tablename varchar(30), @SQL varchar(30)
      set @tablename = 'Table1' --here you specify the name
      set @SQL = concat('SELECT COUNT(*) FROM ', @tablename) --here you build the query
      
      EXEC(@SQL)
      

      第二种方法让您使用带有表名的表:

      declare @SQL varchar(8000)
      set @SQL = ''
      declare @TableNames table(name varchar(30))
      insert into @TableNames values ('Table1'), ('Table2'), ('Table3')
      --here you build the query
      select @SQL = @SQL + ' SELECT ''' + name + ''' AS [TableName], COUNT(*) AS [Count] FROM ' + name + ' UNION ALL' from @TableNames
      -- get rid of last "UNION ALL"
      set @SQL = LEFT(@SQL, LEN(@SQL) - 10)
      --execute the query
      EXEC(@SQL)
      

      它的结果将是:

      TableName    Count
      Table1       3
      Table2       6
      Table3       4
      

      【讨论】:

        【解决方案4】:

        你可以像这样使用sys.dm_db_partition_stats [1]:

        select
            t.col tableName, sum(s.row_count) tableCount
        from 
            yourTable t
        join
            sys.dm_db_partition_stats s
          on
            (object_name(s.object_id) = t.col )
         and 
            (s.index_id < 2)
        group by 
            t.col;
        

        [1]. Related answer


        一行输出版本将是:

        select
            sum(s.row_count), ' ('+t.col +' count) '
        from 
            yourTable t
        join
            sys.dm_db_partition_stats s
          on
            (object_name(s.object_id) = t.col )
         and 
            (s.index_id < 2)
        group by 
            t.col
        for xml path('');
        

        输出:

        2 (Table1 count) 3 (table2 count) 4 (table3 count)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-06
          • 2020-10-28
          • 2012-02-23
          • 2013-03-22
          • 1970-01-01
          • 2010-12-09
          相关资源
          最近更新 更多