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
2 2+3*5 17
3 (2+3)*5 25 */


DROP TABLE tb
GO
DROP FUNCTION getEval
GO
本文介绍了一种在 SQL 中使用 eval 函数来计算表达式的实现方法。通过创建一个存储过程,该过程能解析并计算输入的字符串表达式,返回计算结果。此方法利用了 XML 和 XSLT 的转换技术。
1281

被折叠的 条评论
为什么被折叠?



