私は、データベーステーブルのフィールドタイプを定義し、ダッシュボードの作成中に選択されたユーザ定義フィールドのリストを、ロジックごとに選択された値とともにプルダウンする動的クエリを作成しています演算子。TSQL条件付き結合ステートメント?
例えば、field1
はemployeeID
を選択できます。彼らは検索したいIDを提供することができ、データをレンダリングする必要があるときはfieldID
とfieldValue
をテーブルに格納します。
選択したフィールドによっては、従業員の名前などの詳細情報を得るために別のテーブルに参加する必要があります。
これは簡単ですが、複数の可能なテーブルに対して値を結合する必要がある場合は、面倒な部分が発生します。 employeeID
が格納されている場合は、そのフィールドをemployeeテーブルに追加します。しかし、私がstoreID
を保存していた場合は、そのフィールドをstoresテーブルに追加する必要があります。
私が最後まで気づいて、私が立ち往生する前に、私の考えがありました。基本的に、私は、このフィールドは、私たちemployeeTable
に参加し、その後、人々テーブルisPeople=1
だった場合」と言うつもりだった。
このフィールドisTool=1
場合は、当社のツールのテーブルを結合します。
私は基本的にfieldType
とfieldValue
を持っているに基づいてタイプは、私が保存されている値に特定のテーブルに参加する必要があります。
私はこの作ること、動的SQLを介して働いていたとして、私は私がを使用することができなかったことに気づきました私のIF
条件を作成するためのフィールド。
ie。 IF (fl.isPeople =1) BEGIN ... JOIN Employee Table ... END
これを行うにはダイナミックなアプローチが唯一の方法だったと思いましたが、今は自分の問題の解決策を考えることができません。
結論で...
私は、条件に基づいて、テーブルやクエリのフィールドに参加しようとしています。私は通常のストアドプロシージャでそれを行うように見えなかったので、私は動的にそれをやろうとしましたが、ここで終わり、私が説明しようとしているこの非常に混乱の問題です。
私がさらに明確にできるかどうかを教えてください。
更新:
USE [red]
GO
/****** Object: StoredProcedure [dbo].[ti2_fetch_dashboard] Script Date: 9/15/2016 9:55:39 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Carl
-- Create date: Sept 13, 2016
-- Description: Fetch Single Dashboard for Editing
-- =============================================
ALTER PROCEDURE [dbo].[ti2_fetch_dashboard_test]
@dashboardID INT, @SQL NVARCHAR(MAX) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Fetch our dashboard
SELECT @SQL = 'SELECT d.dashboardID,
d.dashboardOwner,
e.PreferredName AS ownerFirst,
e.LastName AS ownerLast,
e.NTID AS ownerNTID,
d.dashboardTitle,
d.dashboardDescription,
d.dashboardType,
d.creator,
d.timestamp,
d.lastUpdate,
d.isDeleted,
(SELECT sub.QID AS subscriberQID,
e.PreferredName AS subscriberFirst,
e.LastName AS subscriberLast,
e.NTID AS subscriberNTID
FROM dbo.ti_dashboard_subscribers AS sub
LEFT OUTER JOIN
dbo.EmployeeTable AS e
ON sub.QID = e.QID
WHERE sub.dashboardID = d.dashboardID
FOR XML PATH (''options''), ELEMENTS, TYPE, ROOT (''subscribers'')),
(SELECT f.fid,
f.fieldID,
f.[order],
cfg.primaryAllowed,
cfg.secondaryAllowed,
cfg.exportAllowed,
mf.fieldName,
mf.placeholder
FROM dbo.ti_dashboards_fields AS f
INNER JOIN
dbo.ti_dashboard_field_types AS ft
ON f.typeID = ft.fieldTypeID
INNER JOIN
dbo.ti_dashboard_master_fields_config AS cfg
ON f.fieldID = cfg.fieldID
INNER JOIN
dbo.ti_dashboards_master_fields AS mf
ON mf.fieldID = f.fieldID
WHERE f.dashboardID = d.dashboardID
AND ft.fieldTypeName = ''Primary''
ORDER BY f.[order] ASC
FOR XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''primaryFields'')),
(SELECT f.fid,
f.fieldID,
f.[order],
cfg.primaryAllowed,
cfg.secondaryAllowed,
cfg.exportAllowed,
mf.fieldName,
mf.placeholder
FROM dbo.ti_dashboards_fields AS f
INNER JOIN
dbo.ti_dashboard_field_types AS ft
ON f.typeID = ft.fieldTypeID
INNER JOIN
dbo.ti_dashboard_master_fields_config AS cfg
ON f.fieldID = cfg.fieldID
INNER JOIN
dbo.ti_dashboards_master_fields AS mf
ON mf.fieldID = f.fieldID
WHERE f.dashboardID = d.dashboardID
AND ft.fieldTypeName = ''Secondary''
ORDER BY f.[order] ASC
FOR XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''secondaryFields'')),
(SELECT f.fid,
f.fieldID,
f.[order],
cfg.primaryAllowed,
cfg.secondaryAllowed,
cfg.exportAllowed,
mf.fieldName,
mf.placeholder
FROM dbo.ti_dashboards_fields AS f
INNER JOIN
dbo.ti_dashboard_field_types AS ft
ON f.typeID = ft.fieldTypeID
INNER JOIN
dbo.ti_dashboard_master_fields_config AS cfg
ON f.fieldID = cfg.fieldID
INNER JOIN
dbo.ti_dashboards_master_fields AS mf
ON mf.fieldID = f.fieldID
WHERE f.dashboardID = d.dashboardID
AND ft.fieldTypeName = ''Export''
ORDER BY f.[order] ASC
FOR XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''exportFields'')),
(SELECT l.[fieldID],
-- Get the details of each of those fields
(SELECT fl.queryField,
fl.allowMultiple,
fl.isPeople,
fl.isDate,
fl.isSelect,
fl.isInput,
fl.isTool,
fl.selectOptions,
-- Get the values associcated with the fields
(SELECT dv.value';
-- If fl.isPeople = 1
SELECT @SQL += ', e.PreferredName AS FirstName, e.LastName, e.NTID, e.QID ';
-- If fl.isTool = 1
SELECT @SQL += ', t.toolName, t.toolType ';
-- Primary Table
SELECT @SQL += 'FROM dbo.ti_dashboards_logic AS dv ';
-- If fl.isPeople = 1
SELECT @SQL += 'LEFT OUTER JOIN dbo.EmployeeTable AS e ON dv.value = e.QID ';
-- If fl.isTool = 1
SELECT @SQL += 'LEFT OUTER JOIN ti_tools AS t ON dv.value = t.tool ';
-- Rest of Statement
SELECT @SQL += 'WHERE dv.fieldID = l.fieldID
AND dv.dashboardID = d.dashboardID
FOR XML PATH (''data''), TYPE, ELEMENTS, ROOT (''values''))
FROM dbo.ti_dashboard_master_fields_config AS fl
WHERE fl.fieldID = l.fieldID
AND l.dashboardID = d.dashboardID
FOR XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''logicMeta''))
FROM [red].[dbo].[ti_dashboards_logic] AS l
WHERE l.dashboardID = d.dashboardID
GROUP BY l.fieldID, l.dashboardID
FOR XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''logicFields'')),
(SELECT sdb.dashboardID ,
sdb.fieldID ,
sdb.sort ,
sdb.[order] ,
mf.fieldName
FROM dbo.ti_dashboards_sorting AS sdb
JOIN dbo.ti_dashboard_master_fields_config AS sf
ON sdb.fieldID = sf.fieldID
JOIN dbo.ti_dashboards_master_fields AS mf
ON sf.fieldID = mf.fieldID
WHERE sdb.dashboardID = d.dashboardID
ORDER BY sdb.[order] ASC
FOR XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''sortingFields'')
)
FROM dbo.ti_dashboards AS d
LEFT OUTER JOIN
dbo.EmployeeTable AS e
ON d.dashboardOwner = e.QID
WHERE d.dashboardID = @_dashboardID
AND d.isDeleted = 0
FOR XML PATH (''data''), ELEMENTS, TYPE, ROOT (''root'')';
EXEC sp_executesql @SQL, N'@_dashboardID INT', @_dashboardID = @dashboardID
END
投稿コード – Amit
ORMツールを使用してコードレイヤーでより動的なクエリを作成できるようになるか、複数のクエリを使用してデータを抽出することができますDBを1つにまとめようとするのではなく、DBを使用しています。私はあなたが行っている道を歩き回っており、動的に動的なクエリを行うのは良い方法ではありません。あなたのデータセットがちょっと大きければ、すぐにパフォーマンスの問題に陥るでしょう。 –
また、すべてのフィールドをユーザーに提供し、それらを空白( 'NULL')のままにして、結合条件でそのフィールドを確認できますか?そうすれば、使用されているパラメータに対してのみ、常にすべてのテーブルを結合することができます。 – NickyvV