SQL: найдите строку COUNT (*) в таблицах с определенным столбцом - PullRequest
0 голосов
/ 13 сентября 2018

Microsoft SQL 2016 / 13.0: я пытаюсь добавить COUNT (*) к этому запросу. Что делает этот запрос - он находит таблицы с общим соглашением об именах (многие таблицы с общим префиксом) и из этих таблиц - какие таблицы имеют конкретное имя столбца. Пока все хорошо - это работает! Далее мне нужно, чтобы в этих таблицах были какие-либо «строки» (данных) и, если да, сколько строк в каждой таблице. Заранее спасибо за помощь, очень признателен! Ура!

IF OBJECT_ID('tempdb..#result') IS NOT NULL
DROP TABLE #result
GO

CREATE TABLE #result(
   DatabaseName           [nvarchar](128),
   TableName              [nvarchar](128),
   ColumnName             [nvarchar](128),
   --NumOfRows            int NOT NULL, -- COUNT COLUMN
 )
GO

EXEC RunOnAllDataBases'
SELECT 
  {DatabaseName},
  t.name AS TableName, 
  c.name AS ColumnName
  --COUNT(*) AS NumOfRows --COUNT THE ROWS

FROM sys.tables AS t 
INNER JOIN sys.columns c 
ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE ''SPECIFIC COLUMN NAME''
AND (t.name LIKE ''COMMON_TABLE_NAME_%')

{ - SOMEWHERE IN HERE I NEED THE COUNT QUERY - }

ORDER BY TableName;
',
'INSERT into #result';

SELECT * FROM #result
--WHERE NumOfRows > 0 
--ORDER BY NumOfRows DESC

IF OBJECT_ID('tempdb..#result') IS NOT NULL
DROP TABLE #result
GO

Вот что стало решением (есть одна ошибка - нужно объявить скалярную переменную - не уверен, как исправить, хотя, если кто-нибудь увидит где, пожалуйста, не стесняйтесь комментировать) - очень признателен. Ура! * * 1004

IF OBJECT_ID('tempdb..#result') IS NOT NULL
DROP TABLE #result
GO

CREATE TABLE #result (
   [EnterpriseID]             [uniqueidentifier], 
   [EnterpriseName]           nvarchar](100), 
   MY_COUNT_COLUMN            int,  
   MyApp_TableName            [nvarchar](500)
   )
GO

EXEC RunOnAllDataBases'
DECLARE @myresults table (
    [EnterpriseID]             [uniqueidentifier], 
    [EnterpriseName]           [nvarchar](100), 
    MY_COUNT_COLUMN            int,
    MyApp_TableName            [nvarchar](500)
  ) 

DECLARE @MyApp_TableName nvarchar(500)
DECLARE qrylist CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT t.name AS MyApp_TableName 

FROM sys.tables AS t 
INNER JOIN sys.columns c 
ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE ''SPECIFIC COLUMN NAME''
AND (t.name LIKE ''COMMON_TABLE_NAME_%')
ORDER BY MyApp_TableName;

OPEN qrylist

FETCH NEXT FROM qrylist
INTO @MyApp_TableName

WHILE @@FETCH_STATUS = 0
BEGIN
print @MyApp_TableName
declare @cnt int = 0;

exec sp_executesql N''@MyApp_TableName'', 
                   N''@rowcount int output'', @cnt output;

INSERT into @myresults (
            [EnterpriseID], 
            [EnterpriseName],               
            MY_COUNT_COLUMN,
            MyApp_TableName
 )   

SELECT {entid},
       {dbname},
       @cnt,
       @MyApp_TableName

FETCH NEXT FROM qrylist INTO @MyApp_TableName
END

CLOSE qrylist
DEALLOCATE qrylist

SELECT * from @myresults',
'INSERT into #result';

SELECT * FROM #result

IF OBJECT_ID('tempdb..#result') IS NOT NULL
DROP TABLE #result
GO
...