テーブルを動的に作成し、作成したすべてのテーブルを結合する良い方法は何ですか?
バックグラウンド
データベースのさまざまな部分からデータを収集し、使用するために提示するストアド プロシージャを作成しようとしています。たとえば、アリスとボブの両方に請求書を送信したい場合、このストアド プロシージャは請求書のすべての情報を検索します。秘訣は、Alice と Bob が、私が持っているすべての情報を常に必要としているわけではないということです。ボブが免税対象であるがシムオリオンで取引している場合、為替レートに関する情報を含める必要がありますが、税金に関する情報は省略します。ストアド プロシージャに注文番号を付けて、顧客向けに書式設定された結果を取得したいと考えています。
これまでの私の解決策は、顧客の要件を保持するテーブルを作成することです。次に、ストアド プロシージャがテーブルをチェックします。通貨データが必要な場合は、 を作成して入力する@Currency
か、@Taxes
税データなどを保持します。要件を確認し、必要に応じてテーブルを作成します。最後に、データを 1 つのレコード セットに結合する必要があります。
私の問題は、私が言っているエラーがあることです
キーワード「テーブル」付近の構文が正しくありません
AND というエラー
テーブル変数 @Summary を宣言する必要があります
@Summary
これらのエラーは、動的 SQL を使用してテーブルを結合した場合にのみ表示されます。動的 SQL をコメント アウトし、ステートメントを作成するステートメントにコピー アンド ペーストすると、必要な結果が得られます。
コード
Microsoft SQL Server Management Studio で次の動的 SQL を使用しようとしました
create procedure <procedure> (@OrderNumber varchar(20)) AS
DECLARE @CustomerName varchar(35) -- retrieved based on @OrderNumber
DECLARE @SQLQuery nvarchar(500)
DECLARE @ParamDef nvarchar(500)
DECLARE @SummaryTable table
(
ID varchar(20) --=@OrderNumber
, <Stuff>
)
SET @SQLQuery = 'Select * From @SummaryTable'
SET @ParamDef = '@SummaryTable table'
IF EXISTS(Select <TableName> from CustRequirements where <TableName> = 1 AND Customer = @CustomerName)
BEGIN
--Create table
DECLARE @<TableName> table
(
ID varchar(20)
, <Stuff>
)
--Populate
Insert into <TableName> Select <RelevantData> From <DataSource> where <Condition based on @OrderNumber or @CustomerName>
--Pepare Dynamic SQL
Set @SQLQuery = @SQLQuery + ' FULL OUTER JOIN @<TableName> ON <TableName>.ID = SummaryTable.ID'
SET @ParamDef = ', @<TableName> table'
END
<repeat for other tables>
EXECUTE sp_executesql @SQLQuery, @ParamDef, @Summary, @LineItems, @Taxes, @Currency
質問
私のコードに何か問題がありますか? これを行うより良い方法はありますか?私が考えたもう1つのオプションは、各ブランチの下部にステートメント全体IF Exists
を含むツリーを作成することでした(IFでJOIN句を中断できないように見えるため)。問題は、n 個の可能なテーブルを結合するために 2^nステートメントが必要になることです。この場合、n は 20 または 30 の高さになる可能性があります。 JOIN
JOIN