[英]SQL - Write Query with field names and table name stored in a table?
我在一家保險公司工作,並創建一個自定義應用程序。 當我們將承保范圍應用於保單時,它將存儲在具有“限額”,“自付額”和“保費”字段的表中。 但是,有許多覆蓋范圍不符合規范。 他們為“限制”,“自付額”和“保費”使用不同的字段,甚至存儲在不同的表中。 (不要問為什么,甚至不要試圖理解他們仍在這樣做的事實,所以我需要留下邏輯以便允許更多類似的報道。)對於他們選擇什么領域也沒有押韻或理由漂浮不定。
因此,我們決定創建“ LookUp”表,該表將存儲我們涵蓋某個覆蓋范圍所需的所有信息。 這避免了很多連接-我們在應用程序的速度和性能方面遇到了問題。
我需要找到一種將所有這些字段預填充到表中的方法。 我想要最好的選擇性能。 這最終將是一項Nightly工作-因此,當我們收到新的數據快照時,我們將運行此查詢並預填充/更新表的值。
這是我的表格的一個示例,它包含Coverage名稱(Coverage),表格(File)以及Limit,Deductible和Premium字段。 PolicyNum字段是LOB +策略+模塊的串聯。 我需要所有這三個領域來加入一項政策。 我想使用表格,因為他們將添加新的coverage。 請記住,我創建了此表,以便可以向其中添加更多字段。
這是我的表的創建腳本-我從Excel電子表格中填充了該腳本,因此將所有字段設置為nVarChar(255)以便該過程順利運行:
USE [PolicySummary]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Coverage](
[CoverageID] [int] IDENTITY(1,1) NOT NULL,
[LOB] [nvarchar](255) NULL,
[Coverage] [nvarchar](255) NULL,
[Description] [nvarchar](255) NULL,
[File] [nvarchar](255) NULL,
[Limit] [nvarchar](255) NULL,
[Deductible] [nvarchar](255) NULL,
[Premium] [nvarchar](255) NULL,
[IsMultLimit] [bit] NULL,
[IsMultDeductible] [bit] NULL,
[IsMultPremium] [bit] NULL,
[InsuranceLine] [nvarchar](255) NULL,
[PolicyNum] [nvarchar](255) NULL,
CONSTRAINT [PK_Coverage] PRIMARY KEY CLUSTERED
(
[CoverageID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
簡而言之,策略的覆蓋范圍可能為BP0713。 然后,我看一下該表,查看是否需要運行以下查詢:SELECT BYAGVA作為限制,BYPPTX作為自付額,BYA3VA作為Premium FROM ASBYCPP,其中BYARTX + BYASTX + BYADNB = @PolNum
該表包含表名稱,3個字段以及“策略編號”的串聯。
目前,我正在遍歷策略中的每個覆蓋范圍,並在WHLIE循環中一次選擇一個值。 可行,但速度很慢,我多次打查詢只是為了打開應用程序(每個策略有很多單位,因此每個單位都會運行)。
SELECT @SQL = N'SELECT @Limit=' + ISNULL(Limit, '''''') + N',@Deductible=' + ISNULL(Deductible, '''''') + N',@Premium=' + ISNULL(Premium, '''''') + N' FROM PHI_PIJ.dbo.' + [File] + N' WHERE ' + PolicyNum + N' = ''' + @PolNum +'''' + N' AND ' + @CovField + N'='''+Coverage +''''
FROM PolicySummary.dbo.Coverage
WHERE Coverage = @Coverage
AND LOB = @LOB
EXEC sp_executesql @SQL, N'@Limit nVarChar(255) output,@Deductible nVarChar(255) output,@Premium nVarChar(255) output', @Limit output, @Deductible output, @Premium output
INSERT INTO #OptCov2 VALUES(@Coverage, @Description, @LOB, @Limit, @Deductible, @Premium)
我可以在每晚晚上找到一種方法填充“ Lookup”表時獲得幫助嗎,所以我所要做的就是選擇Limit,Deductible,CoverageLookUp中的PREMIUM WHERE PolicyNum = @PolicyNum
我正在使用Microsoft SQL Server Management Studio。
這是到目前為止我得到的。 運行前1000條記錄需要近4分鍾的時間,總共要運行614,497條記錄。
SELECT @SQL = N'SELECT @Limit=' + ISNULL(Limit, '''''') + N',@Deductible=' + ISNULL(Deductible, '''''') + N',@Premium=' + ISNULL(Premium, '''''') + N' FROM PHI_PIJ.dbo.ASBYCPP' + N' WHERE ' + PolicyNum + N' = ''' + @PolicyKey +'''' + N' AND BYAOTX' + N'='''+Coverage +''''
FROM PolicySummary.dbo.Coverage
WHERE Coverage = @Coverage
AND LOB = 'BOP'
EXEC sp_executesql @SQL, N'@Limit nVarChar(255) output,@Deductible nVarChar(255) output,@Premium nVarChar(255) output', @Limit output, @Deductible output, @Premium output
UPDATE PolicySummary.dbo.CoverageLkup
SET Limit = @Limit, Deductible = @Deductible, Premium = @Premium
WHERE CovAbbrev = @Coverage
AND PolicyKey = @PolicyKey
我認為您是從錯誤的角度出發。 我將您的計划表述為“創建一個使用動態SQL路線圖到源數據的映射表”。 相反,我認為您應該將源表中的數據復制*到單個主查詢表中。
雖然這將“復制”數據,但將導致更有效的查找。
* copy:我最初寫過copy,但是我不認為Replication是這里的正確技術。 可能是可能的,但不是復制的預期用例。
您需要其他類型的ETL,可能是非常簡單的作業或SSIS(甚至是觸發器),以使您的查找主機與所有單個零件保持同步。
讓我知道這句話沒有道理。 或者,如果我似乎缺少某些東西。
我意識到這可能不完全是您所擁有的,但是希望這可以為您指明正確的方向。 您絕對想避免循環,尤其是對每個策略都這樣做。
從易於更新的角度來看,我建議以下內容:
這是帶有表名和字段名的表。 它將用於構建您的select語句。 每個表中您僅應有1條記錄。
create table tableref (
tablename nvarchar(255),
lobfield nvarchar(255),
policyfield nvarchar(255),
modulefield nvarchar(255),
limitfield nvarchar(255),
deductfield nvarchar(255),
premiumfield nvarchar(255))
現在創建您的select語句,從tableref中將所有數據從表中拉出
declare @sql nvarchar(max) = '', @unionall nvarchar(50) = ''
select @sql = @sql + @unionall
+ ' select ' + lobfield + '+' + policyfield + '+' + modulefield + ' as policynumber, '
+ limitfield + ' as limit, '
+ deductfield + ' as deduct, '
+ premiumfield + ' as premium '
+ ' from ' + tablename
, @unionall = ' union all '
from tableref
最后但並非最不重要的一點是,將記錄插入到查詢表中
select @sql = 'insert into lookuptable (policynum, limit, deduct, premium) ' + @sql
exec (@sql)
要進行微調,請在適當的位置添加索引。 另外,此解決方案將在@sql中的8000個字符后中斷,因此根據您的情況,您可能需要將其拆分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.