簡體   English   中英

如何在插入SQL Server的主表之前驗證每個列

[英]How to validate each column before inserting into main table in SQL Server

請在插入主表之前幫助我驗證數據。

我的場景:我正在讀取包含各種代碼的XML,我需要將值插入到主表中,如果值對應於Master表中存在的代碼,否則我需要為xml標記名稱拋出一個錯誤,對於哪個主表沒有價值觀。

主表:

titleMaster
AccountTypeMaster
RiskMaster
BranchMaster
Citymaster
CustomerDetails

主表:

CustomerMainTable

表結構和SQL代碼:

Declare @CustomerData TABLE   
(   
    CustomerID int NULL,   
    Citycode varchar(20) NULL,  
    TitleCode int NULL,
    AccountTypeCode varchar(20) NULL,
    AccRiskCode varchar(20)NULL,
    BankBranchCode varchar(20) NULL
)

DECLARE @XML AS XML,@hDoc AS INT, @SQL NVARCHAR (MAX)

SET @XML = N' <Customer>
       <CustomerID>1</CustomerID>
       <Citycode>BBY</Citycode>
       <TitleCode>1</TitleCode>
       <AccountTypeCode>SV</AccountTypeCode>
       <AccRiskCode>H</AccRiskCode>
       <BankBranchCode>BAU001</BankBranchCode>
   </Customer>'

INSERT INTO @CustomerData
    SELECT
        ID1 = XC.value('CustomerID[1]', 'int'),
        CityCode = XC.value('Citycode[1]', 'varchar(20)'),
        TitleCode = XC.value('TitleCode[1]', 'int'),
        AccountTypeCode = XC.value('AccountTypeCode[1]', 'varchar(20)'),
        AccRiskCode = XC.value('AccRiskCode[1]', 'char'),
        BankBranchCode = XC.value('BankBranchCode[1]', 'varchar(20)')
    FROM
        @XML.nodes('/Customer') AS XT(XC)

    SELECT
        ISNULL( B.CustomerName,'Error'), ISNULL(C.CityName,'Error'), 
        ISNULL(D.Titlename,'Error'), ISNULL(E.AccountTypeName,'Error'), 
        ISNULL(F.AccRiskName,'Error'), ISNULL(G.BranchName,'Error') 
    FROM
        @CustomerData  A 
    LEFT OUTER JOIN
        CustomerDetails B ON A.CustomerID = B.CustomerId
    LEFT OUTER JOIN
        Citymaster C ON A.Citycode = C.CityCode
    LEFT OUTER JOIN
        titleMaster D ON A.TitleCode = D.TitleCode
    LEFT OUTER JOIN
        AccountTypeMaster E ON A.AccountTypeCode = E.AccountTypeCode
    LEFT OUTER JOIN
        RiskMaster F ON A.AccRiskCode = F.AccRiskCode
    LEFT OUTER JOIN
        BranchMaster G ON A.BankBranchCode = G.BankBranchCode

到現在為止還挺好。 現在收集這些數據並在必要時拋出錯誤。

    declare @errors xml
;with err as (
SELECT A.CustomerID, A.CustomerName,
    ISNULL( B.CustomerName,'Error') CustomerName_B, 
    A.CityName, ISNULL(C.CityName,'Error') CityName_C, 
    A.Titlename, ISNULL(D.Titlename,'Error') Titlename_D, 
    A.AccountTypeName, ISNULL(E.AccountTypeName,'Error') AccountTypeName_E, 
    A.AccRiskName, ISNULL(F.AccRiskName,'Error') AccRiskName_F, 
    A.BranchName, ISNULL(G.BranchName,'Error') BranchName_G
FROM
    @CustomerData  A 
LEFT OUTER JOIN
    CustomerDetails B ON A.CustomerID = B.CustomerId
LEFT OUTER JOIN
    Citymaster C ON A.Citycode = C.CityCode
LEFT OUTER JOIN
    titleMaster D ON A.TitleCode = D.TitleCode
LEFT OUTER JOIN
    AccountTypeMaster E ON A.AccountTypeCode = E.AccountTypeCode
LEFT OUTER JOIN
    RiskMaster F ON A.AccRiskCode = F.AccRiskCode
LEFT OUTER JOIN
    BranchMaster G ON A.BankBranchCode = G.BankBranchCode
where B.CustomerID is null
or C.CityCode is null
or D.TitleCode is null
or E.AccountTypeCode is null
or F.AccRiskCode is null
or G.BankBranchCode is null
)
select @errors = (select * from err
for xml auto, elements, root('errors')
)
    --chech errors
    if @errors is not null
    begin
    declare @strErr nvarchar(max) = cast(@errors as nvarchar(max))
    raiseerror(@strErr,
               10, -- Severity
               1); -- State
    end
    else --no errors
    begin
    --do something
    end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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