簡體   English   中英

SQL-使用表中存儲的字段名和表名寫查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM