2016-04-24 47 views
1

请在插入主表之前帮助我验证数据。如何验证插入到SQL Server主表之前的每个列

我的方案:我正在阅读包含各种代码的XML,如果值对应于主表中存在的代码,则需要将值插入主表中,否则我需要用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 
+0

请修改您的帖子。这个'我正在阅读包含各种代码',应该在'an'和'contained'之间有一个词。 –

+0

@Dan Bracuk编辑.. –

回答

0

到目前为止好。现在收集这些数据并在必要时抛出错误。

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