2016-04-24 12 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」と「containing」の間にあるはずです。 –

+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 
関連する問題