Как написать один запрос, чтобы получить данные из нескольких таблиц, содержащих похожие имена в SQL Server - PullRequest
0 голосов
/ 12 марта 2019

Начиная с, я не могу изменить соглашения об именах для таблиц. Однако я хочу выполнить один и тот же запрос для каждой таблицы, БЕЗ необходимости заходить и менять имя таблицы каждый раз. У меня есть следующие таблицы:

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

1 Ответ

0 голосов
/ 13 марта 2019

Ответил Брайан. Спасибо, Брайан! Решение - я не форматировал свое EVENTNAME NOT IN в списке должным образом

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...