从其他数据库获取数据

时间:2016-10-05 03:37:00

标签: sql sql-server vb.net winforms visual-studio-2013

帮助我处于需要从上一年的数据库获取数据的情况。 我有这个数据库:

Manila2016
Manila2015
Manila2014
Manila2013
Manila2012
California2016
California2015
California2014

我们在VB.net中建立了一个集中系统,我们在所有分支机构中记录所有业务和工资单交易。

我们有一张表格,记录员工的发布情况。自动取款机。 问题是,如果员工的ATM在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中的样子,它仅检查员工的ATM是否已在当年发布。

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)

2 个答案:

答案 0 :(得分: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)您应该使用存储过程或参数化查询来限制SQ​​L注入。

答案 1 :(得分:0)

创建一个UNION视图,引用您需要的每个表。将静态列添加到包含Branch和Year的视图的每个元素中。此视图需要每年更新(或者您可以提前创建表)。

实际上,一个更好的解决方案是将一个表和Branch和Year作为单独的列,然后为每个分支引入视图,这仍然是设计的重要部分。

所以,改变:RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 致:Branch, Year, RecordNo, ...

在SQL中,将数据放入列而不是表名中几乎总是更容易。