Оригинальный вопрос:
Я работаю с базой данных, которая генерирует новую таблицу каждый месяц и добавляет YYYY_MM
к имени новой таблицы. Мне нужно написать запрос, который будет смотреть на таблицу за текущий месяц. Помимо функций даты, я не могу составить имена таблиц!
Пример имени таблицы будет DOCUMENTS_2011_10
.
Я пытался использовать базовый скрипт, подобный этому, но он не работает из-за синтаксиса:
SELECT * FROM ('DOCUMENTS_'+'2011_10')
Есть предложения?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Таблицы создаются нашим приложением корпоративного портала (Oracle WebCenter Interaction). Я не могу изменить дизайн этого приложения, чтобы изменить способ обработки данных.
Меня попросили извлечь отчет, показывающий ключевые данные из этих таблиц, которые генерируются ежемесячно.
Мой подход заключался в создании подписки на службу отчетов SQL, которая будет отправлять данные каждый месяц в формате Excel.
Мне понадобилась помощь с этим запросом, чтобы подключить его к службе отчетов, чтобы мне не приходилось каждый месяц баловаться запросом, чтобы изменить имя таблицы.
Поскольку служба отчетов будет запускаться каждый месяц и генерировать отчеты, архив данных или любые специальные возможности не требуются.
Используя динамический SQL, я смог установить имя таблицы, к сожалению, когда я пытаюсь добавить остальную часть моего запроса, он жалуется на проблему ограничения символов. Есть идеи как обойти это?
Это дает мне правильную таблицу:
Declare @tblName Varchar(400)
Declare @SQL Varchar(500)
Set @tblName =
'analyticsdbuser.ASFACT_DOCUMENTVIEWS_'
+ CONVERT(VARCHAR,DATEPART(yyyy,GETDATE()))
+ '_'
+ CONVERT(VARCHAR, RIGHT('0' + RTRIM(MONTH(GETDATE())-1), 2));
SET @SQL = 'SELECT * FROM ' + @Tblname;
Exec(@SQL)
Это другой запрос, который нужно выполнить всем, но не вписывается в @SQL:
SELECT t2.ID,
t2.USERID,
t3.NAME,
t2.DOCUMENTID,
t1.NAME AS DOC_NAME,
t4.PROPERTYID,
t5.NAME AS PROP_NAME,
t4.VALUE
FROM ASFACT_DOCUMENTVIEWS_2011_10 AS t2 INNER JOIN
ASDIM_USERS AS t3 ON t3.USERID = t2.USERID INNER JOIN
ASDIM_USERPROPERTYVALUES AS t4 ON t4.USERID = t2.USERID INNER JOIN
ASDIM_KDDOCUMENTS AS t1 ON t1.ID = t2.DOCUMENTID INNER JOIN
ASDIM_USERPROPERTIES AS t5 ON t4.PROPERTYID = t5.PROPERTYID
WHERE (t2.DOCUMENTID IN ('33449', '36241', '36566')) AND
(t4.PROPERTYID IN (26, 156, 157, 158, 159, 325, 160, 162))
ORDER BY t2.DOCUMENTID,
t3.NAME;
ВОПРОС РАЗДЕЛЕНИЯ
Я не знаком с концепцией разбиения, о которой упоминали некоторые люди, и сейчас рассмотрим ее.
В случае, если это имеет значение, каждая из этих ежемесячных таблиц составляет всего около 20 000 строк и 1,5 МБ (мы не большая компания, это программное обеспечение было разработано для компаний, которые получают миллионы строк в каждой из этих ежемесячных таблиц)