我需要创建一个公式列。在此列中,我需要返回一个数值。
例子:
database.dbo.table1 有一个名为“message”的列,其中包含一条长消息。
消息的格式如下:various words, characters, spaces <this document is> document# = 12345 <this document is>
我需要做的是搜索消息,找到“this document is”并在这两个短语之间搜索文档的数值,在公式列中返回文档#。
我需要创建一个公式列。在此列中,我需要返回一个数值。
例子:
database.dbo.table1 有一个名为“message”的列,其中包含一条长消息。
消息的格式如下:various words, characters, spaces <this document is> document# = 12345 <this document is>
我需要做的是搜索消息,找到“this document is”并在这两个短语之间搜索文档的数值,在公式列中返回文档#。
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
使用 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);