2016-12-16 16 views
0

私は、クライアント固有のデータを格納する同じテーブルを持ついくつかのスキームを持つSQL Serverデータベースを持っています。具体的には、次のようになります。SQlサーバー内の単一のデータベース内の複数のスキームを照会

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

などです。
各スキーマにはいくつかのテーブルがありますが、同じテーブルにしかアクセスしませんが、クライアントスキームを動的に変更したいと考えています。
主な目標は、各クライアントの総売上高を見つけることです。それが理にかなってほしい。

ご協力いただきまして誠にありがとうございます。

ありがとうございます!

+0

これを実現するには、動的SQLを使用する必要があります。 –

+2

このような複数のスキーマを使用することは、マルチテナントを実装するための良い方法ではありません。このデザインが選ばれた理由はありますか? – Dai

+0

動的SQLを使用する必要があると思われます。SELECT FROM は選択できません。 –

答えて

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に保存することができます。そして、あなたがClients.TotalSalesを更新してしまうストアドプロシージャを作成することができ

クライアント(ID、名前、DBPATH、TotalSales)

、 DBPathを受け取り、そのTotalSalesを返すストアド関数を使用します。

0

1つの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**) + ..... 

について何でもあなたはすべてのスキーマ名を知っている必要があります。

合計」は、合計したいフィールド/列の名前です。 「セール」は、テーブルの名前です。

関連する問題