2016-12-16 47 views
0

我有一个SQL Server数据库,其中有几个方案都具有存储客户端特定数据的相同表格。具体如下:在SQl服务器中的单个数据库中查询多个方案

[database1].[client1].[table1] 
[database1].[client2].[table1] 
[database1].[client3].[table1] 

依此类推。
尽管我只想访问同一个表,但动态地更改Client方案,但每个方案都有几个不同的表。
主要目标是找到每个客户的总销售额。希望它是有道理的。

任何帮助,非常感谢。

谢谢!

+0

您需要使用动态sql来实现此目标... –

+2

使用这种多模式不是实现多租户的好方法。这个设计被选中是否有原因? – Dai

+0

我怀疑你需要使用动态SQL:它不能选择。 –

回答

0

请使用下面的脚本。它会为表中的所有行选择所有列。您也可以添加自定义列,其中查询字符串条件:

DECLARE @Clients AS TABLE 
(
    SeqNo INT IDENTITY(1,1), 
    ClientName VARCHAR(255), 
    Qry VARCHAR(MAX) 
) 
DECLARE @v_Min INT,@v_Max INT,@TempQry VARCHAR(MAX) 

INSERT INTO @Clients 
(
    ClientName, 
    Qry 
) 
SELECT 
    DISTINCT 
     TABLE_SCHEMA, 
     Qry = 'SELECT * FROM [DatabaseName].['+TABLE_SCHEMA+'].['+TABLE_NAME+']' 
    FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME IN ('Your Table Name') 

SELECT 
    @v_Min = MIN(SeqNo), 
    @v_Max = MAX(SeqNo) 
    FROM @Clients 

WHILE ISNULL(@v_Min,0) <= ISNULL(@v_Max,0) 
BEGIN 

    SELECT 
     @TempQry = Qry 
     FROM @Clients 
      WHERE SeqNo = @v_Min 

    EXEC(@TempQry) 

    SELECT 
     @v_Min = ISNULL(@v_Min,0)+1 

END 
0
select 'Database 1' as Name, sum([db1].[dbo].table1.sales) as Total_Sales from [db1].[dbo].table1 
union 
select 'Database 2' as Name, sum([db2].[dbo].table1.sales) as Total_Sales from [db2].[dbo].table1 

是最简单的例子。如果你有很多客户端,那么有一个数据库存储你拥有的客户端可能是可行的。该数据库中的客户端数据库的路径可以被存储在一个table这样的:

客户端(ID,姓名,DBPATH,TotalSales)

然后,你可以创建一个存储过程,它会更新Clients.TotalSales,使用一个可以接收DBPath并返回其TotalSales的存储函数。

0

怎么样一个SQL语句,

Select (Select **ifnull**(**sum**(**Total**),0) FROM **Schema1**.**sale**) + (Select **ifnull**(**sum**(**Total**),0) FROM **Schema2**.**sale**) + (Select **ifnull**(**sum**(**Total**),0) FROM **Schema3**.**sale**) + ..... 

但你必须知道所有的架构名称。

我认为'总计'是你想要得到总计的字段/列的名称。 和'销售'是的名称。

相关问题