Sql server 如何在SQLServer中存储数学公式
我有一个表包含以下数据:Sql server 如何在SQLServer中存储数学公式,sql-server,tsql,Sql Server,Tsql,我有一个表包含以下数据: ID | expression ----|------------ 1 | select 1+9 2 | select 6+23+3 ----|------------ 我需要一个查询来获得结果: ID | expressionValue ----|------------ 1 | 10 2 | 32 ----|------------ 您可以这样尝试: declare @x nvarchar(100) select @x = ex
ID | expression
----|------------
1 | select 1+9
2 | select 6+23+3
----|------------
我需要一个查询来获得结果:
ID | expressionValue
----|------------
1 | 10
2 | 32
----|------------
您可以这样尝试:
declare @x nvarchar(100)
select @x = expression from myTable where id = 1
EXECUTE sp_executesql @x
DECLARE @myRes TABLE
(
ID INT ,
expression NVARCHAR(100)
)
DECLARE @temp TABLE ( ID INT )
DECLARE @ID INT ,
@expression NVARCHAR(100)
DECLARE cur CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT ID , expression FROM myTable
OPEN cur
FETCH NEXT FROM cur INTO @ID, @expression
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @temp
INSERT INTO @temp
EXEC ( @expression )
INSERT INTO @myRes
VALUES ( @ID, ( SELECT * FROM @temp ) )
FETCH NEXT FROM cur INTO @ID, @expression
END
CLOSE cur
DEALLOCATE cur
SELECT * FROM @myRes
如果希望对表中的所有行执行此操作,请尝试创建一个游标并对列执行它,如下所示:
declare @x nvarchar(100)
select @x = expression from myTable where id = 1
EXECUTE sp_executesql @x
DECLARE @myRes TABLE
(
ID INT ,
expression NVARCHAR(100)
)
DECLARE @temp TABLE ( ID INT )
DECLARE @ID INT ,
@expression NVARCHAR(100)
DECLARE cur CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT ID , expression FROM myTable
OPEN cur
FETCH NEXT FROM cur INTO @ID, @expression
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @temp
INSERT INTO @temp
EXEC ( @expression )
INSERT INTO @myRes
VALUES ( @ID, ( SELECT * FROM @temp ) )
FETCH NEXT FROM cur INTO @ID, @expression
END
CLOSE cur
DEALLOCATE cur
SELECT * FROM @myRes
输出:
ID expressionValue
1 10
2 32
ID expressionValue
1 10
2 32
试试这个
create table expr(id int,epres varchar(max))
insert into expr values(1,'select 2+2')
insert into expr values(2,'select 2-1')
declare @sql varchar(max),@id int
select top 1 @sql = epres,@id=id from expr where epres is not null order by id
while @@rowcount > 0
begin
exec(@sql)
select top 1 @sql = epres ,@id=id from expr where id > @id order by id;
end;
如果公式中只有+和-那么可以使用XML.query:
SELECT ID,
CAST(
REPLACE(
REPLACE(
REPLACE(expression,'select ','<v><d>')
,'+','</d><d>')
,'-','</d><d>-') + '</d></v>'
as xml).query('for $s in /v return data(fn:sum($s/d))') as expressionValue
FROM YourTable
CREATE TABLE #Results ( --Table to store results
ID int,
expressionValue nvarchar(max)
)
DECLARE @sql nvarchar(max) --will hold the dynamic SQL query
SELECT @sql = COALESCE(@sql,'DECLARE @x xml = ''''; INSERT INTO #Results ') +
'SELECT '+CAST(ID as nvarchar(max))+' as ID,
CAST(@x.query('''+REPLACE(expression,'select ','')+''') as nvarchar(max)) UNION '
FROM #YourTable --query generation
SELECT @sql = LEFT(@sql,LEN(@sql)-LEN(' UNION '))
此外,您还可以避免使用动态SQL执行SELECT FORMAT语句,并使用更安全的XML.query方法:
SELECT ID,
CAST(
REPLACE(
REPLACE(
REPLACE(expression,'select ','<v><d>')
,'+','</d><d>')
,'-','</d><d>-') + '</d></v>'
as xml).query('for $s in /v return data(fn:sum($s/d))') as expressionValue
FROM YourTable
CREATE TABLE #Results ( --Table to store results
ID int,
expressionValue nvarchar(max)
)
DECLARE @sql nvarchar(max) --will hold the dynamic SQL query
SELECT @sql = COALESCE(@sql,'DECLARE @x xml = ''''; INSERT INTO #Results ') +
'SELECT '+CAST(ID as nvarchar(max))+' as ID,
CAST(@x.query('''+REPLACE(expression,'select ','')+''') as nvarchar(max)) UNION '
FROM #YourTable --query generation
SELECT @sql = LEFT(@sql,LEN(@sql)-LEN(' UNION '))
如果使用PRINT@sql,您将得到如下结果:
DECLARE @x xml = '';
INSERT INTO #Results
SELECT 1 as ID,
CAST(@x.query('1+9') as nvarchar(max))
UNION
SELECT 2 as ID,
CAST(@x.query('6+23+3') as nvarchar(max))
然后执行:
EXEC sp_executesql @sql
然后,您可以从结果表中选择:
输出:
ID expressionValue
1 10
2 32
ID expressionValue
1 10
2 32
您想提供一个Id并计算该Id的表达式,还是要计算所有Id并输出结果?@Samir Mohamed Nasr ElDinn,请注意,此解决方案可能很危险。例如,有人可以添加3 | drop table MyTable