如果XML元素不存在,则引发异常

时间:2013-12-10 12:14:03

标签: sql sql-server tsql sql-server-2012 sqlxml

我有多个接受XML参数的程序(我知道我可以使用TVP,但它适用于应用程序也传递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的第二行实际上没有colA元素。我知道这会在表中创建一个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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

END