我有多個接受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)
精湛,謝謝。如果上述代碼位於另一個過程調用的過程中,是否需要在您的示例之後直接調用ROLLBACK,然後在ROLLBACK之後直接調用RAISERROR,還是完全由第一個過程處理ROLLBACK? – EvilDr