我需要创建一个公式列。在此列中,我需要返回数字值。
示例:
database.dbo.table1有一个名为"消息"的列,其中包含一个长消息。
该消息的格式为:various words, characters, spaces <this document is> document# = 12345 <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);