Как я могу использовать динамическое имя таблицы в области ОТ запроса SQL? - PullRequest
2 голосов
/ 17 ноября 2011

Оригинальный вопрос: Я работаю с базой данных, которая генерирует новую таблицу каждый месяц и добавляет 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 МБ (мы не большая компания, это программное обеспечение было разработано для компаний, которые получают миллионы строк в каждой из этих ежемесячных таблиц)

Ответы [ 2 ]

7 голосов
/ 17 ноября 2011

Имена объектов и столбцов не могут быть динамическими в SQL Server.

Вам потребуется использовать динамический SQL для его сборки, скажем, с помощью sp_executesql

...
SET @SQL = 'DOCUMENTS_'+'2011_10';
EXEC sp_executesql @sql ...

Сказать, что встраивание подобной информации в имя объекта, как правило, плохая практика. Что произойдет, если вы захотите данные за 3 месяца в одном запросе?

2 голосов
/ 17 ноября 2011

Не зная больше - существует множество опций

  1. написание динамического sql: http://www.tek -tips.com / faqs.cfm? Fid = 3132

    Set @SQL = 'SELECT * From #TempTable Where EmpID in (' + @INList +')'
    Exec(@SQL)
    

    может быть тем, что вы ищете, однако

  2. У вас есть разделенные виды, и вы получаете доступ только из вида?Было бы целесообразно хранить вещи в отдельных таблицах, но обеспечивать доступ к данным, как если бы они находились в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...