sqlserver利用sp_oa系列存储过程调用xml+xsl eval输出运算结果的一个例子。

CREATE   FUNCTION  getEval( @s   VARCHAR ( 100 ))
RETURNS   VARCHAR ( 100 )
AS
BEGIN

DECLARE   @xmlDoc   INT , @xslDoc   INT , @err   INT , @outValue   INT , @outStr   VARCHAR ( 100 )
DECLARE   @str   VARCHAR ( 1000 ), @xsl   VARCHAR ( 8000 )
SET   @str = ' <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<root>
' + @s + ' </root> '

SET   @xsl = ' <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<xsl:script>
function eVal(node)
{
  return eval(node.selectSingleNode("//root").text);
}
</xsl:script>
<xsl:eval>eVal(this)</xsl:eval>
</xsl:template>
</xsl:stylesheet>
'

-- SELECT @str,@xsl
EXEC   @err = sp_OACreate  ' Msxml2.DOMDocument.3.0 ' , @xmlDoc  OUT
EXEC   @err = sp_OASetProperty  @xmlDoc , ' async ' , ' false '
EXEC   @err = sp_OAMethod  @xmlDoc , ' LoadXML ' , @outValue  OUT, @str
EXEC   @err = sp_OACreate  ' Msxml2.DOMDocument.3.0 ' , @xslDoc  OUT
EXEC   @err = sp_OASetProperty  @xslDoc , ' async ' , ' false '
EXEC   @err = sp_OASetProperty  @xmlDoc , ' resolveExternals ' , ' false '
EXEC   @err = sp_OAMethod  @xslDoc , ' LoadXML ' , @outValue  OUT, @xsl
EXEC   @err = sp_OAMethod  @xmlDoc , ' transformNode ' , @outStr  OUT, @XslDoc
EXEC   @err = sp_OADestroy  @xmlDoc
EXEC   @err = sp_OADestroy  @xslDoc

RETURN   @outStr
END

GO


CREATE   TABLE  tb(id  INT   IDENTITY ( 1 , 1 ),v  VARCHAR ( 1000 ))
GO
INSERT  tb  SELECT   ' 1*2+3 '
UNION   ALL   SELECT   ' 2+3*5 '
UNION   ALL   SELECT   ' (2+3)*5 '
GO

SELECT  id,v,dbo.getEval(v)  FROM  tb
GO
/*1 1*2+3 5 
2 2+3*5 17 
3 (2+3)*5 25  */



DROP   TABLE  tb
GO

DROP   FUNCTION  getEval
GO

你可能感兴趣的:(xml,存储,sqlserver,XSL,encoding,stylesheet)