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

来源:互联网 发布:淘宝明星周边店 编辑:程序博客网 时间:2024/05/20 03:07
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