1

tblWarr_SWH_WarrCLHD_35[Account No]、の列に複合主キーを持つ動的に構築されたクエリがいくつかありtblWarr_SWH_WarrCLHD_35.[Claim No]ます。

最近、結果に例外を提供するように求める新しい要件が出てきたため、ユーザーは各行を[Account No]とで除外するように求めることができます[Claim No]。行の例外の数は不確定になります。

クライアントが例外リスト[Account No][Claim No]組み合わせを渡すための最良の方法は何でしょうか?

文字列を渡してT-SQL内で解析する必要がありますか?私はこのようにそれを構築することができます

AND NOT ([Account No] = 'abc' AND [Claim No] = 'cde') 
AND NOT ([Account No] = 'fgh' AND [Claim No] = 'ijk')

結果は、2つのテーブルを持つ型付きデータセットを介してクライアントソフトウェアに表示されます。

生データ

DECLARE @SQL nvarchar(4000)
DECLARE @SQLWhere nvarchar(4000) 
DECLARE @SQLOrder nvarchar(MAX)

SET @SQL = 'SELECT tblWarr_SWH_WarrCLHD_35.[Account No], tblWarr_SWH_WarrCLHD_35.[Claim No], tblWarr_SWH_WarrCLHD_35.ClaimCost, 
                      tblWarr_SWH_WarrCLHD_35.[Serial No], tblWarr_SMT_MCType_47.[Machine Type], tblWarr_SMH_MCHist_34.[Date Built], 
                      tblWarr_SMH_MCHist_34.[Date Sold], tblWarr_SVC_ServiceCodes.[Service Code], tblWarr_DefectCodes.Code AS [Defect Code], 
                      tblWarr_SPN_PartNo_01.[Part No], tblWarr_SPN_PartNo_01.[Part Description], tblWarr_SWH_WarrCLHD_35.[Failed Part No Qty], 
                      tblWarr_MachineHours.[Machine Hours At Failure], tblWarr_SWH_WarrCLHD_35.[Claim Date], tblWarr_SNA_WarNar_77.Narrative, 
                      tblWarr_SSU_Supplier_09.[Supplier Name],tblWarr_SWH_WarrCLHD_35.[ClaimStateID]
                FROM tblWarr_SMH_MCHist_34 INNER JOIN
                      tblWarr_SWH_WarrCLHD_35 ON tblWarr_SMH_MCHist_34.[Serial No] = tblWarr_SWH_WarrCLHD_35.[Serial No] INNER JOIN
                      tblWarr_SMT_MCType_47 ON tblWarr_SMH_MCHist_34.MachineTypeID = tblWarr_SMT_MCType_47.ID INNER JOIN
                      tblWarr_SVC_ServiceCodes ON tblWarr_SWH_WarrCLHD_35.ServiceCodeFullID = tblWarr_SVC_ServiceCodes.ID INNER JOIN
                      tblWarr_DefectCodes ON tblWarr_SWH_WarrCLHD_35.DefectCodeID = tblWarr_DefectCodes.ID INNER JOIN
                      tblWarr_SPN_PartNo_01 ON tblWarr_SWH_WarrCLHD_35.FailedPartNoID = tblWarr_SPN_PartNo_01.ID INNER JOIN
                      tblWarr_MachineHours ON tblWarr_SWH_WarrCLHD_35.MachineHoursID = tblWarr_MachineHours.ID INNER JOIN
                      tblWarr_SNA_WarNar_77 ON tblWarr_SWH_WarrCLHD_35.NarrativeID = tblWarr_SNA_WarNar_77.ID INNER JOIN
                      tblWarr_SSU_Supplier_09 ON tblWarr_SWH_WarrCLHD_35.SupplierID = tblWarr_SSU_Supplier_09.ID'
SET @SQLWhere = ' WHERE ((tblWarr_SPN_PartNo_01.[Part No] = @_PartNumber) AND '
SET @SQLOrder = ' ORDER BY CAST(tblWarr_SMH_MCHist_34.[Date Built] AS smalldatetime) DESC'

IF (@ClaimDateFrom IS NOT NULL AND @ClaimDateTo IS NOT NULL)AND (LEN(@ClaimDateFrom) > 0 AND LEN(@ClaimDateTo) > 0)
    SET @SQLWhere = @SQLWhere + '(tblWarr_SWH_WarrCLHD_35.[Claim Date] BETWEEN @_ClaimDateFrom AND @_ClaimDateTo) AND '

IF (@BuildDateFrom IS NOT NULL AND @BuildDateTo IS NOT NULL)AND (LEN(@BuildDateFrom) > 0 AND LEN(@BuildDateTo) > 0)
    SET @SQLWhere = @SQLWhere + '(CAST(tblWarr_SMH_MCHist_34.[Date Built] AS SmalldateTime) BETWEEN @_BuildDateFrom AND @_BuildDateTo) AND '

IF (@ClaimStates IS NOT NULL)AND (LEN(@ClaimStates) > 0)
    SET @SQLWhere = @SQLWhere + '(tblWarr_SWH_WarrCLHD_35.[ClaimStateID] IN (SELECT value FROM Split(''' + ',' + ''',@_ClaimStates))) AND '

IF LEN(@SQLWhere) > 0
    SET @SQL = @SQL + LEFT(@SQLWhere, LEN(@SQLWhere)-4) + ')' + @SQLOrder

EXEC sp_executesql @SQL,
    N'@_PartNumber nvarchar(20), @_ClaimDateFrom smalldatetime, @_ClaimDateTo smalldatetime, @_BuildDateFrom smalldatetime, @_BuildDateTo smalldatetime, @_ClaimStates nvarchar(50)',
    @_PartNumber = @PartNumber, @_ClaimDateFrom = @ClaimDateFrom, @_ClaimDateTo = @ClaimDateTo, @_BuildDateFrom = @BuildDateFrom, @_BuildDateTo = @BuildDateTo, @_ClaimStates = @ClaimStates

集合体データ

DECLARE @SQL nvarchar(4000)
DECLARE @SQLWhere nvarchar(4000) 
DECLARE @SQLOrder nvarchar(MAX)
DECLARE @Date1 as nvarchar(5)   

SET @Date1 = '01/'

SET @SQL = 'SELECT CAST(@_Date1 + CAST(DATEPART(mm,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(2)) + ''' + '/' + ''' + CAST(DATEPART(yyyy,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(4)) as smalldatetime) AS ClaimDate , COUNT(tblWarr_SWH_WarrCLHD_35.[Claim No]) As FaultCount
                FROM tblWarr_SMH_MCHist_34 INNER JOIN
                      tblWarr_SWH_WarrCLHD_35 ON tblWarr_SMH_MCHist_34.[Serial No] = tblWarr_SWH_WarrCLHD_35.[Serial No] INNER JOIN
                      tblWarr_SMT_MCType_47 ON tblWarr_SMH_MCHist_34.MachineTypeID = tblWarr_SMT_MCType_47.ID INNER JOIN
                      tblWarr_SVC_ServiceCodes ON tblWarr_SWH_WarrCLHD_35.ServiceCodeFullID = tblWarr_SVC_ServiceCodes.ID INNER JOIN
                      tblWarr_DefectCodes ON tblWarr_SWH_WarrCLHD_35.DefectCodeID = tblWarr_DefectCodes.ID INNER JOIN
                      tblWarr_SPN_PartNo_01 ON tblWarr_SWH_WarrCLHD_35.FailedPartNoID = tblWarr_SPN_PartNo_01.ID INNER JOIN
                      tblWarr_MachineHours ON tblWarr_SWH_WarrCLHD_35.MachineHoursID = tblWarr_MachineHours.ID INNER JOIN
                      tblWarr_SNA_WarNar_77 ON tblWarr_SWH_WarrCLHD_35.NarrativeID = tblWarr_SNA_WarNar_77.ID INNER JOIN
                      tblWarr_SSU_Supplier_09 ON tblWarr_SWH_WarrCLHD_35.SupplierID = tblWarr_SSU_Supplier_09.ID'
SET @SQLWhere = ' WHERE ((tblWarr_SPN_PartNo_01.[Part No] = @_PartNumber) AND '
SET @SQLOrder = ' GROUP BY CAST(@_Date1 + CAST(DATEPART(mm,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(2)) + ''' + '/' + ''' + CAST(DATEPART(yyyy,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(4)) as smalldatetime) ORDER BY CAST(@_Date1 + CAST(DATEPART(mm,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(2)) + ''' + '/' + ''' + CAST(DATEPART(yyyy,CAST(tblWarr_SMH_MCHist_34.[Date Built] as smalldatetime)) as nvarchar(4)) as smalldatetime)'

IF (@ClaimDateFrom IS NOT NULL AND @ClaimDateTo IS NOT NULL)AND (LEN(@ClaimDateFrom) > 0 AND LEN(@ClaimDateTo) > 0)
    SET @SQLWhere = @SQLWhere + '(CAST(tblWarr_SWH_WarrCLHD_35.[Claim Date] AS SmalldateTime) BETWEEN @_ClaimDateFrom AND @_ClaimDateTo) AND '

IF (@BuildDateFrom IS NOT NULL AND @BuildDateTo IS NOT NULL)AND (LEN(@BuildDateFrom) > 0 AND LEN(@BuildDateTo) > 0)
    SET @SQLWhere = @SQLWhere + '(CAST(tblWarr_SMH_MCHist_34.[Date Built] AS SmalldateTime) BETWEEN @_BuildDateFrom AND @_BuildDateTo) AND '

IF (@ClaimStates IS NOT NULL)AND (LEN(@ClaimStates) > 0)
    SET @SQLWhere = @SQLWhere + '(tblWarr_SWH_WarrCLHD_35.[ClaimStateID] IN (SELECT value FROM Split(''' + ',' + ''',@_ClaimStates))) AND '

IF LEN(@SQLWhere) > 0
    SET @SQL = @SQL + LEFT(@SQLWhere, LEN(@SQLWhere)-4) + ')' + @SQLOrder

EXEC sp_executesql @SQL,
    N'@_PartNumber nvarchar(20), @_ClaimDateFrom smalldatetime, @_ClaimDateTo smalldatetime, @_BuildDateFrom smalldatetime, @_BuildDateTo smalldatetime, @_Date1 nvarchar(5), @_ClaimStates nvarchar(50) ',
    @_PartNumber = @PartNumber, @_ClaimDateFrom = @ClaimDateFrom, @_ClaimDateTo = @ClaimDateTo, @_BuildDateFrom = @BuildDateFrom, @_BuildDateTo = @BuildDateTo, @_Date1 = @Date1, @_ClaimStates = @ClaimStates
4

1 に答える 1

1

例外を次のように渡すことをお勧めします。

"account_A,claim_1;account_B,claim_2;account_C, claim_3;"

次に、この文字列を解析してテーブル @ExceptionAccountsAndClaims を返す関数を作成できます。

例外アカウント | ExceptionClaim

アカウント_A | 請求_1

アカウント_B | 請求_2

アカウント_C | 請求_3

次に、動的クエリで次の条件を使用します。

WHERE (SELECT COUNT(*) FROM @ExceptionAccountsAndClaims e WHERE tblWarr_SWH_WarrCLHD_35.[アカウント番号] = e.ExceptionAccount AND tblWarr_SWH_WarrCLHD_35.[クレーム番号] = e.ExceptionClaim) = 0

注: 状態は 100% 正しいとは限りません。必要に応じて、適切に機能するように修正してください。

幸運を。

于 2012-08-29T13:48:55.860 に答える