2016-10-05 2 views
2

Помощь Я нахожусь в ситуации, когда мне нужно было получить данные из базы данных за предыдущий год. У меня есть эти базы данных:Получить данные из других баз данных

Manila2016 
Manila2015 
Manila2014 
Manila2013 
Manila2012 
California2016 
California2015 
California2014 

Мы имеем централизованную систему, составленную в VB.net, где мы все записи бизнеса и зарплатные операции во всех отраслях.

У нас есть таблица, где мы записываем выпуск банкоматов сотрудников. Проблема в том, что если в 2015 году был выпущен банкомат сотрудника (Manila2015), запись сохраняется в базе данных Manila2015, тот же процесс в предыдущие годы.

Теперь мы используем базу данных Manila2016, мне нужно проверить, получил ли сотрудник уже свой банкомат в Manila2015 или Manila2014, Manila2013 и т. Д.

Я могу просто присоединиться ко всем базам данных, но, как я уже сказал, система централизована и использует базу данных в зависимости от назначенной ветви. В калифорнийском филиале есть только 3 базы данных, поэтому, по-моему, мне нужно зациклиться во всех базах данных на основе ветви, прежде чем я начну искать данные сотрудников ATM.

Это то, что структура таблицы выглядит следующим образом:

RecordNo - int 
EmployeeID - nvarchar 
Name - nvarchar 
Position -nvarchar 
ATM -bit 
ATMreleasedDate -smalldatetime 
Status - nvarchar 

Это то, что мой код выглядит в VB.NET, где он только проверяет, если банкомат работника уже выпущены в текущем году.

Dim Year as string = '2016' 
Dim Branch as string = 'Manila' 
Dim EmployeeID as string = '10087654321-MNL' 

sql = <string>  
SELECT 
EmployeeID, 
Name, 
Position, 
CASE When ATM IS NULL THEN 'NO' ELSE 'YES' END [ATM], 
ATMrelasedDate, 
Status 
FROM <%= Branch %><%= Year %> WHERE EmployeeID = '<%= EmployeeID %>' 
<string> 
ExecuteSQLQuery(sql) 
+0

Из того, что вы описали «структуру баз данных», я считаю, что вы имеете в виду разные таблицы, а не разные базы данных. Я предполагаю, что то, что вы пытаетесь достичь, требует переменной (идентификатор ветки), после чего вы выбираете из определенных таблиц на основе ветки. – ZLK

ответ

0

Создайте UNION, чтобы просмотреть ссылки на каждую из таблиц, которые вам нужны. Добавьте статический столбец (столбцы) в каждый элемент представления, содержащий ветку и год. Это представление нужно будет обновлять ежегодно (или вы можете заранее создать таблицы).

На практике лучшим решением было бы иметь отдельную таблицу с ветвью и годом в виде отдельных столбцов, а затем вводить представления для каждой ветви, это остается важной частью дизайна.

So, change: RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status to: Branch, Year, RecordNo, ....

В SQL почти всегда проще помещать данные в столбцы, чем в имена таблиц.

+0

Но я не могу изменить таблицы, мы используем эту структуру таблиц уже давно. –

+0

Первый вариант не требует изменений в существующей схеме. Он позволяет оставлять существующие приложения без изменений, но запрашивать одну структуру, как объясняется @SQLDBA.Это также требует ежегодного изменения. Используйте материализованное представление, если вы по-прежнему обеспокоены производительностью. Я бы все же подумал об изменении дизайна в долгосрочной перспективе на единую таблицу. Это позволяет значительно улучшить рост. – Pekka

1

Я согласен с @Pekka. Вы должны просто создать представление UNION. Это не влияет на существующие таблицы.

CREATE VIEW vwAllBranches AS 

    SELECT "Manila2016" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2016 
    UNION 
    SELECT "Manila2015" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2015 
    UNION 
    SELECT "Manila2014" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2014 
    UNION ALL 
    SELECT "Manila2013" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2013 
    UNION 
    SELECT "Manila2012" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2012 
    UNION 
    SELECT "California2016" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2016 
    UNION ALL 
    SELECT "California2015" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2015 
    UNION 
    SELECT "California2014" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2014 

И тогда вы можете просто сделать SELECT * FROM vwAllBranches, чтобы получить данные. Пара вещей, хотя ...

1) Вам следует подумать о создании индекса в представлении.

2) Чтобы ограничить SQL-инъекцию, вы должны использовать хранимую процедуру или параметризованный запрос.

+0

Да, но моя проблема в том, что я не могу просто кодировать ее как Manila2016, Manila2015 и т. Д. Я забираю имя базы данных на основе того, с какой веткой вы находитесь. От ветвей не только Манила и Калифорния, мы имеем больше, чем 10 местоположений, так что потребуется много кода и времени поиска. я думаю, есть ли в любом случае, я могу просто зациклить всю базу данных ветвей? например, если мой филиал Manila, я бы просто выполнил поиск во всей базе данных Manila. Кроме того, с помощью этого запроса мне пришлось бы снова редактировать исходный код в 2017 году и снова в 2018 году. –

 Смежные вопросы

  • Нет связанных вопросов^_^