问题描述
||
我可以通过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