2013-12-10 67 views
1

我有多個接受XML參數的程序(我知道我可以用TVP代替,但它適用於應用程序也通過XML的舊方法)。如果XML元素不存在,則引發異常

下面的代碼填充表從XML:

DECLARE @tmp TABLE (userID int, colA int); 
DECLARE @xml XML = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<rows> 
    <row userId="1" colA="234" /> 
    <row userId="1" colB="564" /> 
    <row userId="1" colA="252" /> 
</rows>'; 

INSERT INTO @tmp 
    (userID, colA) 
SELECT 
    u.n.value('@userId', 'int'), 
    u.n.value('@colA', 'int') 
FROM 
    @xml.nodes('/rows/row') AS u (n); 

SELECT * FROM @tmp; 

然而要注意XML的第二行實際上並沒有可樂元素。我知道這會在表中創建一個NULL,但在我的應用程序中,NULL值是允許的。

userID  colA 
----------- ----------- 
1   234 
1   NULL 
1   252 

那麼,有沒有什麼辦法在填充數據之前在TSQL中執行某種類型的檢查(如此)?

For each XML row 
    If (userId element does not exist) OR (colA element does not exist) Then 
     RAISERROR (caught by BEGIN/END TRAN within procedures/calling procedure) 

回答

1

可以使用SQLXML exist爲:

select @xml.exist('rows/row[not(@colA)]') 

將返回1如果有不具有colA屬性一行。所以,你可以使用像

if @xml.exist('rows/row[not(@colA)]') = 1 
    ... 
    -- raiserror here 
    ... 

sql fiddle demo

+0

精湛,謝謝。如果上述代碼位於另一個過程調用的過程中,是否需要在您的示例之後直接調用ROLLBACK,然後在ROLLBACK之後直接調用RAISERROR,還是完全由第一個過程處理ROLLBACK? – EvilDr

0
IF EXISTS (SELECT * FROM @tmp WHERE userId IS NULL OR colA IS NULL) 
BEGIN 
    RAISERROR ('Your Error Message', 16, 1) 

END 
+0

對不起,這將無法正常工作(請參閱我在哪裏聲明NULL是允許的)。不管怎麼說,還是要謝謝你 – EvilDr

相關問題