2016-12-16 62 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**) + ..... 

但你必須知道所有的架構名稱。

我認爲'總計'是你想要得到總計的字段/列的名稱。 和'銷售'是的名稱。