Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer中存储数学公式_Sql Server_Tsql - Fatal编程技术网

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