SQL:使用计算字符串作为表名,联接select的所有行以进行计数

SQL:使用计算字符串作为表名,联接select的所有行以进行计数,sql,ms-access,select,join,Sql,Ms Access,Select,Join,我可以通过ODBC使用MS access访问MS SQL Server,我想显示表名、列名和每个表的行数。表名存储在名为“sys\u tables”的表中,列名存储在“sys\u 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 =

我可以通过ODBC使用MS access访问MS SQL Server,我想显示表名、列名和每个表的行数。表名存储在名为“sys\u tables”的表中,列名存储在“sys\u 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 as表名中使用计算字符串的正确方法是什么?我可以做一个选择所有没有实际关系的行的子选择吗?

你不能这样做:

SELECT COUNT(t.name)
FROM sys_tables AS t INNER JOIN sys_columns AS c ON t.object_id = c.object_id

不能将变量用作表名。唯一的解决方法是动态SQL


然而,我怀疑在
sys
中的某个地方有一个表,它给出了每个表的行数,尽管它可能不是完全最新的。

在服务器端的SQL语句中不能使用变量表名。您需要从SQL Server获取表名,然后使用这些名称将新查询(每个表一个)发送回SQL Server。您还可以在SQL Server上编写一个存储过程,以使用动态SQL处理此问题(只要确保在使用动态SQL时熟悉注入攻击)

SQL Server将一些行计数信息存储在
sysindexes
列中的
sys.indexes
(不要与
sys.indexes
相混淆)虽然此信息并非总是100%准确

最后,您可以使用未记录的存储过程
sp\MSForEachTable
,如下所示:

EXEC sp_msForEachTable
    'SELECT PARSENAME(''?'', 1),
    COUNT(*) FROM ?'

请注意,最后一个方法将返回多个结果集(每个表一个),因此您需要在Access中以这种方式处理它,或者将它们组合到一个临时表中,然后将它们作为一个结果集返回。所有这些都可以在存储过程中完成。

这将只返回数据库中的列数,而不是每个表的计数。还有其他例子(注意,并非所有答案都通过ODBC访问工作)。这是一个有趣的挑战。我很想知道怎么做。同时,我也很好奇您打算如何在Access应用程序中使用这些信息:SQL Server数据库中表的名称;列的名称和每个表中的行数。在Jet/ACE SQL中无法参数化表名,因此最终的问题实际上无法回答。这只能通过动态编写SQL来完成。另一个正确答案建议使用未记录的存储过程,但MS Access无法通过ODBC提供该存储过程。