2016-11-01 15 views
1

パラメータとして@FirmIdを使用するストアドプロシージャを書きたいと思います。このパラメータに従って関連するテーブルを使用します。パラメータに応じて異なるテーブルを返すストアドプロシージャ

は私が(私は使用しない)を取得したいと、そのようなものです:

CREATE PROCEDURE spFirmDetailGetByFirmId 
    @FirmId AS INT 
AS 
BEGIN 
    IF @FirmId = 1 
     SELECT * FROM Firm1 
    ELSE IF @FirmId = 2 
     SELECT * FROM Firm2 
     . 
     . 
     . 
     . 
    ELSE IF @FirmId = 1000 
     SELECT * FROM Firm1000 
END 

そしてまた私は、そのようなことを、クエリ文字列を作成し、それをEXECする必要はありません休止中のコードブロックで実際のクエリは複雑すぎるため、このオプションを使用すると管理が非常に難しくなります。

CREATE PROCEDURE spFirmDetailGetByFirmId 
    @FirmId AS INT 
AS 
BEGIN 
    DECLARE @Query AS NVARCHAR(MAX) = 'SELECT * FROM Firm' 
    SET @Query = @Query + CAST(@FirmId AS NVARCHAR(10)) 
    EXEC(@Query) 
END 

その他のオプションはありますか?おかげさまで

+1

他のオプションはありませんが、テーブルが同じでも数字の場合は、番号を識別子として1つのテーブルにすべて入れることがあります。それに失敗すると、ダイナミックSQLはあなたの最良の選択肢と思われます。 – ZLK

+1

唯一の選択肢は、テーブルを再設計して 'FirmId'カラムを持つ' firm'テーブルが1つしかないようにすることです。 – Blorgbeard

+0

@Blorgbeard私はデザインが悪いと知っていますが、残念ながらdbは私のコントロール下にありません。それは別の会社によって設計されているので、私はこのように私のレポート画面に使う必要があります。 – GorkemHalulu

答えて

3

私ははいテーブルが同一であり、二つのアプローチを提案するために、同一のを保持されますあなたのを取る:

DECLARE @Firm VARCHAR(10)='Firm3'; 

SELECT * FROM Firm1 WHERE @Firm='Firm1' 
UNION ALL 
SELECT * FROM Firm2 WHERE @Firm='Firm2' 
UNION ALL 
SELECT * FROM Firm3 WHERE @Firm='Firm3' 
[...] 
UNION ALL 
SELECT * FROM Firm1000 WHERE @Firm='Firm1000' 

秒は次のとおりです。

DECLARE @query NVARCHAR(MAX)='SELECT * FROM ####'; 
SET @query=REPLACE(@query,'####',@Firm); 
EXEC (@query) 

VIEWで使用することができ(@queryの代わりに)VIEWの定義を変数に読み込み、ALTER VIEW文を動的に作成することができます。プロシージャは同じVIEWを呼び出します(ただし、これは、並列呼び出しでクラッシュ!)

1

このコードは自動にストアドプロシージャで使用してビューを作成することができ、あなたが列を追加する必要があるたびに

declare @tableId int 
declare @columns varchar(max) 
declare @tablesCount int 
declare @tableName varchar(255) 
declare @query varchar(255) 
declare @id int 
declare @result nvarchar(max) 

set @columns = '' 
set @tableName = 'Firm' 
set @id = 1 
set @result = '' 

--Base table 
select @tableId = object_id from sys.tables where name [email protected] 
--Count how many table with the 'same name' 
select @tablesCount= count(*) from sys.tables where name like @tableName+'%' 
--Build Columns to add in the view 
select @columns [email protected]+name+', 'from Sys.columns where object_id = @tableId 

--Drop View 
set @result = 'Drop view vw_'[email protected] 
exec sp_executesql @result 
set @result='' 

while(@id<[email protected]) 
Begin 
declare @idVarchar varchar(10) 
set @idVarchar = cast(@id as varchar(10)) 

set @result [email protected]+'Select '[email protected][email protected]+' as FirmId from '[email protected][email protected] 
+' 
Union all 
' 
set @id [email protected]+1 
End 
set @result = substring(@result, 1, len(@result)-12) 
set @result='Create view vw_'[email protected]+' as 
'[email protected] 


exec sp_executesql @result 

あなたは、これに他の選択肢がありますsp_helpTextを使用してビューの現在の定義を取得し、追加するだけで新しいテーブル識別子を追加する

+0

お世話になりました。 sys.tablesを使うのは面白い方法です。私は実際の生活のためにあなたの質問を最適化しようとしています。 – GorkemHalulu

+2

この種の手順のアイデアは、管理者のために使用されます。たとえば、ファイルグループを作成し、その上にいくつかのテーブルを作成し、古いデータをアーカイブする手順があります。履歴レポートで使用されているビューを再構築する – Byron

関連する問題