我之前问过有关不区分大小写标记的 XML 查询的问题,我也找到了解决方案。但我也找到了一些其他的解决方案。所以桌子就像
DECLARE @myTable TABLE ( yourXML XML )
INSERT INTO @myTable SELECT '<z><a><b>1</b><c>2</c></a></z>'
INSERT INTO @myTable SELECT '<Z><A><b>1</b><c>2</c></A></Z>'
Run Code Online (Sandbox Code Playgroud)
以下所有解决方案都返回我想要的(不区分大小写的标签)
-----Solution 1----------
SELECT * FROM @myTable WHERE ( [yourXML].exist('for $x in /*[lower-case(local-name(.)) = "z"]/*[lower-case(local-name(.)) = "a"] where ( ($x/*[lower-case(local-name(.)) = "b"][1]) = 1 ) return $x')>0 )
-------------------------
-----Solution 2----------
SELECT * FROM @myTable
WHERE
(CONVERT(XML,LOWER(CONVERT(VARCHAR(MAX),[yourXML]))).exist('for $x in /z/a where ( ($x/b[1]) = 1 ) return $x')>0 )
-------------------------
-----Solution 3----------
SELECT * FROM @myTable WHERE
([yourXML].exist('for …Run Code Online (Sandbox Code Playgroud) 假设我有以下 XML 数据,其中
<root>可以有任意数量的<child>孩子<child>可以有任意数量的<grandchild>孩子<grandchild>可以有任意数量的<greatgrandchild>孩子<child>并且<grandchild>可以有任意数量的<parameter>孩子<parameter>都有<name>一个<value>孩子例如,
<root name="root">
<child name="a">
<grandchild name="a1">
<parameter>
<name>param1</name>
<value>ABC123</value>
</parameter>
<parameter>
<name>param2</name>
<value>CBC</value>
</parameter>
<greatgrandchild name="a1a">
<parameter>
<name>paramA</name>
<value>ABC</value>
</parameter>
<parameter>
<name>paramB</name>
<value>DBC</value>
</parameter>
</greatgrandchild>
</grandchild>
</child>
</root>
Run Code Online (Sandbox Code Playgroud)
我需要做的是选择包含“_BC”的值的参数,其中 _ 是一个不是 A 的字符。
我有以下查询
SELECT
TestId,
[root],
child,
grandchild,
NULL AS greatgrandchild,
parameter
FROM (
SELECT
TestId,
[root].a.value('@name', 'varchar(max)') AS …Run Code Online (Sandbox Code Playgroud) 我使用下面的查询来搜索整个 xml 中的子字符串(包括节点名称和节点值)
SELECT *
FROM tablename
WHERE ( Charindex('abc',CAST([xmlcolumn] AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)
我想要一个性能比这更好的替代查询。所以请推荐一些。详情如下: 表:
CREATE TABLE [dbo].[tablename](
[Sl_no] [int] NOT NULL,
[Date] [date] NULL,
[Operation] [nvarchar](max) NULL,
[Allot] [nvarchar](50) NULL,
**[xmlcolumn]** [xml] NULL,
[By] [nvarchar](255) NULL,
[Dept] [nvarchar](255) NULL,
[Db] [varchar](255) NULL,
[tabl] [varchar](255) NULL,
[Remark] [varchar](5000) NULL,
[Work] [int] NULL,
[F2] [nvarchar](max) NULL,
[F6] [nvarchar](max) NULL,
[F5] [nvarchar](max) NULL,
[F8] [nvarchar](max) NULL,
[ListC] [nvarchar](255) NULL,
[pro] [nvarchar](max) NULL,
[Completed] [varchar](50) NULL,
[WorkTime] [xml] NULL,
[RelatedData] [varchar](255) NULL,
[User] …Run Code Online (Sandbox Code Playgroud) 所以这就是我到目前为止所拥有的:
--Read xml content into a XML data type variable
DECLARE @FileData XML
SELECT @FileData = CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK '\\file_path\test.xml', SINGLE_BLOB) AS x
--Read from the XML variable to create Entity-Attribute-Value table
SELECT N1.Id.value('@Id', 'varchar(50)') as Id
, N1.Id.value('@Name', 'varchar(100)') as Name
, N2.AttributeLongName.value('@AttributeName', 'varchar(100)') as AttributeName
, N3.AttributeValue.value('.', 'varchar(MAX)') as AttributeValue
FROM @FileData.nodes('/Data/Entities/Entity') as N1(Id) ---1st lvl Node contains the Entity
cross apply Id.nodes('Attributes/Attribute') as N2(AttributeName) --2nd lvl Node contains AttributeName
cross apply AttributeName.nodes('Values/Value') as N3(AttributeValue) --3rd lvl …Run Code Online (Sandbox Code Playgroud) 我有一个查询,如下所示。
DECLARE @tbl TABLE
(
id INT,
col XML
)
INSERT INTO @tbl
VALUES
(1,'<Root>
<Row>
<User>xyz</User>
<Rowid>1</Rowid>
</Row>
<Maxrowid>1</Maxrowid>
</Root>'),
(2,'<Root>
<Row>
<User>xyz</User>
<Rowid>1</Rowid>
</Row>
<Row>
<User>mnj</User>
<Rowid>2</Rowid>
</Row>
<Maxrowid>2</Maxrowid>
</Root>'),(3,'<Root>
<Row>
<User>abs</User>
<Rowid>1</Rowid>
</Row>
<Row>
<User>xra</User>
<Rowid>2</Rowid>
</Row>
<Maxrowid>2</Maxrowid>
</Root>
')
--table before---
SELECT *
FROM @tbl t1
------------------
DECLARE @id varchar
SELECT @id = 'xyz'
SELECT *
FROM @tbl t1
WHERE col.exist('//*/text()[contains(.,sql:variable("@id"))]') = 1
Run Code Online (Sandbox Code Playgroud)
我期待这个查询输出在 xml 列 'col' 中任何地方都有 'xyz' 的行。但它返回所有行。(当我检查它返回所有在 xml 列中包含“x”的行。所以请告诉我为什么会发生?我哪里出错了?还请纠正它。
此外,我还有另一个问题,即对上面相同的 xml 的以下查询不返回任何输出。我希望它返回 xml …
select case 'NULL' when 'NULL' then 'f' end as out
Run Code Online (Sandbox Code Playgroud)
输出:f
但
select case (select (SELECT LEFT(l.list,LEN(l.list)-1)
FROM
(SELECT o.Reciting_Path + '|' + o.Declaimer +',' AS [text()]
FROM Poetry_Reciting AS o
where o.Poetry_Id=6764
FOR XML PATH(''))l(list)) ) when 'NULL' then 'N' end as dd
Run Code Online (Sandbox Code Playgroud)
应该只返回NULL并且 NULL 是正确的,但 case 语句不起作用。
我想要输出中的“N”