标签: xml

查询在 xml 中搜索子字符串

我使用下面的查询来搜索整个 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)

performance xml sql-server-2008-r2 xquery query-performance

1
推荐指数
1
解决办法
5万
查看次数

xml 查询存在并包含给出意外结果

我有一个查询,如下所示。

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 …

xml sql-server sql-server-2008-r2 xquery

0
推荐指数
1
解决办法
1138
查看次数

获取 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 sql-server

0
推荐指数
1
解决办法
7507
查看次数

特信行为问题?

我以非常模糊的方式提出问题,因为我无法用简短的句子解释我的问题是什么。

一般来说,我有一组转换文本和 XML 的过程。里面的程序,我有很多NVARCHARXML变量与表XML列。在我的数据中,我有特殊的字母(例如ò)。当我运行所有代码时,特殊字符消失并显示为?- 这意味着我得到了VARCHAR而不是NVARCHAR.

总的来说,我一切都好,直到最后的步骤。我得到了EXEC哪个调用存储过程具有类型为临时构造的变量NVARCHAR。我有一个包含XML字段的表。在这种情况下,我得到了?. 如果我手动运行程序(不在 中EXEC INTO),我会得到正确的符号。

任何想法为什么会发生这种情况?我检查了所有变量,它们是NVARCHAR.

xml dynamic-sql sql-server-2012 cast unicode

0
推荐指数
1
解决办法
47
查看次数

在 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”

xml sql-server transaction xquery

-1
推荐指数
1
解决办法
1749
查看次数