SQL: использовать вычисляемую строку в качестве имени таблицы, объединить все строки выбора для подсчета - PullRequest
3 голосов
/ 26 мая 2011

У меня есть доступ к MS SQL Server с MS Access через ODBC, и я хочу отобразить имена таблиц, имена их столбцов и количество строк в таблице.Имена таблиц хранятся в таблице с именем "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 в качестве имени таблицы?Могу ли я сделать дополнительный выбор, который выбирает все строки без реального отношения?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Нельзя использовать имя переменной таблицы в выражении SQL на стороне сервера.Вам нужно будет получить имена таблиц из SQL Server, а затем использовать их для отправки новых запросов (по одному для каждой таблицы) обратно в SQL Server.Вы также можете написать хранимую процедуру на SQL Server для обработки этого с использованием динамического SQL (просто убедитесь, что вы знакомы с атаками внедрения, когда вы используете динамический SQL).

SQL Server хранит некоторую информацию о количестве строк вsysindexes (не путать с sys.indexes) в столбце rowcnt. Эта информация не всегда на 100% точна, хотя .

Наконец, вы можете использовать недокументированную хранимую процедуру sp_MSForEachTable примерно так:

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

Имейте в виду, что этоПоследний метод вернет несколько наборов результатов (по одному для каждой таблицы), поэтому вам нужно обработать его таким образом в Access или объединить их во временную таблицу, а затем вернуть их как один набор результатов.Вы можете сделать все это в хранимой процедуре.

0 голосов
/ 26 мая 2011

Нельзя использовать переменную для имени таблицы. Единственный обходной путь - динамический SQL.

Тем не менее, я подозреваю, что где-то в sys есть таблица, в которой указано количество строк для каждой таблицы, хотя, возможно, она и не обновляется идеально.

0 голосов
/ 26 мая 2011

Не можете ли вы сделать это:

SELECT COUNT(t.name)
FROM sys_tables AS t INNER JOIN sys_columns AS c ON t.object_id = c.object_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...