我有多个接受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)
答案 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