Начиная с, я не могу изменить соглашения об именах для таблиц. Однако я хочу выполнить один и тот же запрос для каждой таблицы, БЕЗ необходимости заходить и менять имя таблицы каждый раз. У меня есть следующие таблицы:
Customer
------------
CLOG201902
CLOG201901
CLOG201812.....(one per month going back 10 years. The average CLOG table contains 200,000 lines.
Из записи клиента я вытащу CustomerName
, Account
, Address
.
Из таблицы EACH CLOG я извлеку дату, время, EventType
и т. Д.
Фильтрация по: Customer.instno = 38
(требуется только для этого установщика #) и только соответствующая активность по сигналу тревоги (пожар, бург и т. Д.)
Я пытался (причина, по которой он не работал в нижней части кода):
DECLARE @sql AS NVARCHAR(MAX) = ''
SELECT @sql = @sql + N'
SELECT DISTINCT
CUSTID
, KEYALM
, CUSTPRIV.NAME AS "PROPERTY NAME"
, EVENTNAME AS "ALARM TYPE"
, EVSTRING
, ZONE
, POINTID
, USRNO
, CUSTOMER.BRANCHNO
FROM ['+ SCHEMA_NAME(schema_id) +'].' + name + ' INNER JOIN
CUSTOMER ON CUSTOMER.SERIALNO = ['+ SCHEMA_NAME(schema_id) +'].' + name + ' .SERIALNO INNER JOIN
CUSTPRIV ON CUSTOMER.SERIALNO = CUSTPRIV.SERIALNO
WHERE KEYALM IS NOT NULL
AND BRANCHNO = 38
AND EVENTNAME IS NOT NULL
UNION ALL '
FROM sys.tables where name like 'clog2019%'
SELECT @sql = SUBSTRING(@sql, 0, len(@sql)-9)
SELECT @sql
exec sp_executesql @SQL
(Это производит все, но я не могу отфильтровать больше, чтобы не включать СОБЫТИЯ "ОТКРЫТО", "ЗАКРЫТЬ", "ТЕСТ". Они хотят видеть только действительные линии тревоги)
Я пробовал:
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = STUFF
((
SELECT ' UNION ALL SELECT FROM ' + NAME AS [text()]
FROM sys.tables
WHERE NAME LIKE 'CLOG2019%'
FOR XML PATH('')
) ,1,11,'');
EXEC sp_executesql @sql;
Это также возвращает каждую строку, и я не могу фильтровать с предложением where вообще.
Если бы я собирался запускать запрос на каждый месяц отдельно, он выглядел бы так:
SELECT DISTINCT
CONVERT(varchar,EVDATE,(1)) AS DATE
, CONVERT(VARCHAR,EVDATE,(8)) AS TIME
, CUSTID
, KEYALM
, EVENTNAME
, EVSTRING
, ZONE
, POINTID
, USRNO
, CUSTOMER.BRANCHNO
FROM CLOG201902 INNER JOIN
CUSTOMER ON CUSTOMER.SERIALNO = CLOG201902.SERIALNO INNER JOIN
CUSTPRIV ON CUSTOMER.SERIALNO = CUSTPRIV.SERIALNO
WHERE KEYALM IS NOT NULL
AND BRANCHNO = 38
AND (EVENTNAME LIKE 'CRITICAL'
OR EVENTNAME LIKE 'FIRE'
OR EVENTNAME LIKE 'BURGLARY')
(обидная часть этого - я должен менять CLOG каждый месяц (120 раз)
Спасибо за любую помощь! Я учусь методом проб и ошибок ...... нет формального обучения.
РЕШЕНИЕ СПАСИБО БРИАН!
ОБЪЯВИТЬ @sql AS nvarchar (max) = ''
SELECT @sql = @sql + N'
SELECT DISTINCT
CUSTID
, KEYALM
, CUSTPRIV.NAME AS "PROPERTY NAME"
, EVENTNAME AS "ALARM TYPE"
, EVSTRING
, ZONE
, POINTID
, USRNO
, CUSTOMER.BRANCHNO
FROM ['+ SCHEMA_NAME(schema_id) +'].' + name + ' INNER JOIN
CUSTOMER ON CUSTOMER.SERIALNO = ['+ SCHEMA_NAME(schema_id) +'].' + name + ' .SERIALNO INNER JOIN
CUSTPRIV ON CUSTOMER.SERIALNO = CUSTPRIV.SERIALNO
WHERE KEYALM IS NOT NULL
AND BRANCHNO = 38
AND EVENTNAME IS NOT NULL
AND EVENTNAME NOT IN (''OPEN'', ''CLOSE'', ''TEST'') --double single quotes made the error go away and worked! 20,000 rows down to 1,061!
UNION ALL '
FROM sys.tables where name like 'clog2019%'
SELECT @sql = SUBSTRING(@sql, 0, len(@sql)-9)
SELECT @sql
exec sp_executesql @SQL