我使用下面的查询来搜索整个 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) 我有一个查询,如下所示。
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 …
我在 SE 上至少回答了 5 个问题,但我一定已经因为沮丧而做了一些非常糟糕的事情。
我有一个存储过程,它返回这样的 XML:
<pmsg:Messages>
<pmsg:Message Info="blah" />
</pmsg:Messages>
Run Code Online (Sandbox Code Playgroud)
我需要获取Info.
DECLARE @xmlMessage XML;
EXEC procReturnsXml @xmlMessage OUTPUT;
-- returns 0 rows
WITH XMLNAMESPACES('pmsg' AS pmsg)
SELECT msgs.msg.value('@Info', 'nvarchar(max)')
FROM @xmlMessage.nodes('pmsg:Messages/pmsg:Message') msgs(msg);
-- returns NULL
WITH XMLNAMESPACES('pmsg' AS pmsg)
SELECT @xmlMessage.value('(/pmsg:Messages/pmsg:Message/@Info)[1]', 'nvarchar(max)');
-- returns NULL
WITH XMLNAMESPACES('pmsg' AS pmsg)
SELECT t.x.value('(/pmsg:Messages/pmsg:Message/@Info)[1]', 'nvarchar(max)') AS INFO
FROM @xmlMessage.nodes('/*') t(x);
Run Code Online (Sandbox Code Playgroud)
一般来说,我根本不明白这些是什么意思。你能提供一个关于这个案例的例子吗?
我以非常模糊的方式提出问题,因为我无法用简短的句子解释我的问题是什么。
一般来说,我有一组转换文本和 XML 的过程。里面的程序,我有很多NVARCHAR和XML变量与表XML列。在我的数据中,我有特殊的字母(例如ò)。当我运行所有代码时,特殊字符消失并显示为?- 这意味着我得到了VARCHAR而不是NVARCHAR.
总的来说,我一切都好,直到最后的步骤。我得到了EXEC哪个调用存储过程具有类型为临时构造的变量NVARCHAR。我有一个包含XML字段的表。在这种情况下,我得到了?. 如果我手动运行程序(不在 中EXEC INTO),我会得到正确的符号。
任何想法为什么会发生这种情况?我检查了所有变量,它们是NVARCHAR.
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”
xml ×5
sql-server ×3
xquery ×3
cast ×1
dynamic-sql ×1
performance ×1
transaction ×1
unicode ×1