SQL:使用计算的字符串作为表名,将select的所有行连接起来进行计数

问题描述

|| 我可以通过ODBC访问具有MS Access的MS SQL Server,并且我想显示表名称,列名称和每个表的行数。表名存储在名为\“ sys_tables \”的表中,列名存储在\“ sys_columns \”中。不幸的是,必须计算每个表的行数。由于我没有SQL经验,因此我的第一次尝试不起作用:
SELECT t.name,c.name,t.object_id,x.cnt
FROM sys_tables AS t INNER JOIN sys_columns AS c ON t.object_id = c.object_id
LEFT OUTER JOIN (SELECT COUNT(*) AS cnt FROM @t.name AS tbl ON tbl.cnt > 0) AS x
在SELECT中将计算字符串用作表名的正确方法是什么?我可以做一个子选择来选择所有没有实际关系的行吗?     

解决方法

您不能将变量用于表名。唯一的解决方法是动态SQL。 但是,我怀疑在
sys
的某处有一张表,该表可以给出每个表的行数,尽管它可能无法保持最新​​状态。     ,您不能在服务器端的SQL语句中使用变量表名称。您将需要从SQL Server获取表名,然后使用这些表名将新查询(每个表一个)发送回SQL Server。您还可以在SQL Server上编写一个存储过程,以使用动态SQL进行处理(只要确保您在使用动态SQL时就熟悉注入攻击)即可。 SQL Server在“ 4”列的“ 2”中存储一些行计数信息(不要与“ 3”混淆)。但是,此信息并非总是100%准确。 最后,您可以像下面这样使用未记录的存储过程“ 5”:
EXEC sp_msForEachTable
    \'SELECT PARSENAME(\'\'?\'\',1),COUNT(*) FROM ?\'
请注意,最后一个方法将返回多个结果集(每个表一个),因此您需要在Access中以这种方式进行处理或将它们组合到一个临时表中,然后将它们作为一个结果集返回。您可以在存储过程中完成所有这些操作。     ,您不能这样做:
SELECT COUNT(t.name)
FROM sys_tables AS t INNER JOIN sys_columns AS c ON t.object_id = c.object_id
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...