-1

我需要创建一个公式列。在此列中,我需要返回一个数值。

例子:

database.dbo.table1 有一个名为“message”的列,其中包含一条长消息。

消息的格式如下:various words, characters, spaces <this document is> document# = 12345 <this document is>

我需要做的是搜索消息,找到“this document is”并在这两个短语之间搜索文档的数值,在公式列中返回文档#。

4

2 回答 2

1
declare @mytab table (doc xml)    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      doc.value('(//@DocumentID)[1]','int')
from        @mytab

如果不是保存为 XML 而是保存为 VARCHAR

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      cast (doc as xml).value('(//@DocumentID)[1]','int')
from        @mytab
于 2016-12-20T19:58:17.563 回答
0

使用 SQLXML XQuery 函数/方法(例如 doc.value() 通常很昂贵,应尽可能避免使用。在这种情况下,根据提供的信息,您可以使用CHARINDEX获得所需的信息。

如果您正在使用 (n)varchar 字段,您可以这样做:

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM (SELECT SUBSTRING(doc, CHARINDEX('DocumentID="',doc)+12,20) FROM @mytab) start(ci);

如果您正在使用 XML 字段,您可以这样做:

declare @mytab table (doc xml); 
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM 
(
  SELECT SUBSTRING
    (
      CAST(doc AS varchar(max)), 
      CHARINDEX('DocumentID="', CAST(doc AS varchar(max)))+12,
      20
    )
  FROM @mytab
) start(ci);
于 2016-12-20T21:02:20.737 回答