T- SQL как иметь несколько критериев в функции xml .exist - PullRequest
0 голосов
/ 16 января 2020

Этот код работает, но мне нужно иметь несколько критериев в методе .exist. "where State = 'FL' и Department = 'HR'" в том же узле Objects. Я пробовал много способов, но не повезло. Кто-нибудь знает, как?

Спасибо заранее.

If OBJECT_ID(N'tempdb..#xml') Is Not Null
    Drop Table #xml
Create Table #Xml
(
      RecordId INT IDENTITY(10,1) NOT NULL PRIMARY KEY,
      XmlData XML NOT NULL
)

GO

Declare @xml xml =
'<?xml version="1.0" ?>
<DataObject>
    <Objects>
        <Object Name="FirstName" Value="John" />
        <Object Name="LastName" Value="Smith" />
        <Object Name="City" Value="Miami" />
        <Object Name="State" Value="FL" />
        <Object Name="Department" Value="HR" />
    </Objects>
</DataObject>'
Insert #xml select @xml

Set @xml =
'<?xml version="1.0" ?>
<DataObject>
    <Objects>
        <Object Name="FirstName" Value="Jane" />
        <Object Name="LastName" Value="Doe" />
        <Object Name="City" Value="Hollywood" />
        <Object Name="State" Value="FL" />
        <Object Name="Department" Value="Accounting" />
    </Objects>
</DataObject>'

Insert #xml select @xml

Declare @Dept varchar(30) = 'HR', @State varchar(30) = 'FL'

Select  RecordID
From    #Xml
Where   XMLData.exist('//Objects[Object[@Name="State"][@Value=sql:variable("@State")]]') = 1

1 Ответ

0 голосов
/ 16 января 2020

Пожалуйста, попробуйте следующее. Выражение XPath проверяет именно то, что вам нужно.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE
(
    RecordId INT IDENTITY(10,1) PRIMARY KEY,
    XmlData XML NOT NULL
);

INSERT INTO @tbl (XmlData)
VALUES (N'<?xml version="1.0" ?>
<DataObject>
    <Objects>
        <Object Name="FirstName" Value="John" />
        <Object Name="LastName" Value="Smith" />
        <Object Name="City" Value="Miami" />
        <Object Name="State" Value="FL" />
        <Object Name="Department" Value="HR" />
    </Objects>
</DataObject>')
, (N'<?xml version="1.0" ?>
<DataObject>
    <Objects>
        <Object Name="FirstName" Value="Jane" />
        <Object Name="LastName" Value="Doe" />
        <Object Name="City" Value="Hollywood" />
        <Object Name="State" Value="FL" />
        <Object Name="Department" Value="Accounting" />
    </Objects>
</DataObject>');
-- DDL and sample data population, end

DECLARE @Dept VARCHAR(30) = 'HR', @State CHAR(2) = 'FL';

SELECT  RecordID
FROM    @tbl
WHERE   XMLData.exist('/DataObject/Objects[Object[@Name="State" and @Value=sql:variable("@State")] 
    and Object[@Name="Department" and @Value=sql:variable("@Dept")]]') = 1;

Вывод

+----------+
| RecordID |
+----------+
|       10 |
+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...