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

DROP TABLE tb
GO
DROP FUNCTION getEval
GO发表于 @ 2008年03月28日 16:50:00 | 评论( loading... ) | 举报| 收藏