表格输入
IF OBJECT_ID('TEMPDB..#t1') IS NOT NULL
DROP TABLE #t1
CREATE TABLE #t1
([a] int, [b] int, [c] varchar(100))
;
INSERT INTO #t1
([a], [b], [c])
VALUES
(1, 2, 'a+b'),
(5, 6, 'a*b'),
(2, 1, 'a-b'),
(3, 8, 'b/a')
;
select * from #t1
表格的结果
预期产出
预期结果如上所示。 在表格中我们为每条记录都有一些列和公式,我们需要显示所有列,但在公式列而不是公式中我们需要根据公式列显示计算结果(此处为c)
注意 :我们需要这是动态的我们不知道我们需要使用公式column.formula不能是静态的公式< / p>
答案 0 :(得分:1)
这是一个使用动态sql执行公式的简单方法:
CREATE TABLE #t1
(
[a] INT,
[b] INT,
[c] VARCHAR(100)
);
INSERT INTO #t1
(
[a],
[b],
[c]
)
VALUES
(5, 2, 'a*b');
DECLARE @cFormula AS NVARCHAR(20);
SELECT TOP 1
@cFormula = c
FROM #t1;
DECLARE @sql AS NVARCHAR(50) =
N'SELECT TOP 1 a, b, ' + @cFormula + ' AS cResult FROM #t1 AS t';
EXECUTE sp_executesql @sql;
DROP TABLE #t1;
产地:
a b cResult
5 2 10
这将适用于单行,因此您可以使用此方法和一些循环机制来迭代行,可能是游标。您没有提供任何其他列来显示您是否有可用于订购的ID或其他内容,因此请注意这一点。
答案 1 :(得分:0)
BEGIN TRAN
DECLARE @Strt INT ,@End INT
IF OBJECT_ID('TEMPDB..#t1') IS NOT NULL
DROP TABLE #t1
CREATE TABLE #t1
([a] int, [b] int, [c] varchar(100),[D] numeric(22,6))
;
INSERT INTO #t1
([a], [b], [c])
VALUES
(1, 2, 'a+b'),
(5, 6, 'a*b'),
(2, 1, 'a-b'),
(3, 8, 'b/a')
IF OBJECT_ID('TEMPDB..#TT') IS NOT NULL
DROP TABLE #TT
SELECT ROW_NUMBER()Over(Order by a)Rowno,* INTO #TT FROM #t1
SET @Strt =1
SELECT @End=MAX(Rowno)FROM #TT
WHILE @Strt <=@END BEGIN
DECLARE @Formula AS NVARCHAR(20),@sql NVARCHAR(MAX)
SELECT @Formula = c
FROM #TT WHERE Rowno = @Strt
SET @sql='
UPDATE #TT SET D ='+@Formula+'
WHERE Rowno ='''+Convert(Nvarchar,@Strt)+''''
PRINT @sql
EXECUTE(@sql)
SET @Strt= @Strt+1
END
SELECT * FROM #TT
ROLLBACK TRAN
答案 2 :(得分:-1)
只需使用CASE
,因为选项不多
SELECT a, b, CASE
WHEN c = 'a+b' or c = 'b+a' THEN a + b
WHEN c = 'a-b' THEN a - b
WHEN c = 'a*b' or c = 'b*a' THEN a * b
WHEN c = 'a/b' THEN a / b
WHEN c = 'b-a' THEN b - a
WHEN c = 'b/a' THEN b / a
END c
FROM #t1
您可以使用CURSOR
来获得更通用的解决方案
DECLARE c CURSOR FOR SELECT a, b, c FROM #t1;
DECLARE @v varchar(100)
DECLARE @a int
DECLARE @b int
DECLARE @sqlcmd varchar(8000)
OPEN c
FETCH NEXT FROM c INTO @a, @b, @v
SET @sqlcmd = 'SELECT ' + @v + ' FROM (SELECT CAST(' + CAST(@a as varchar) + ' AS DECIMAL(10,2)) as a, CAST(' + CAST(@b as varchar) + ' AS DECIMAL(10,2)) as b) t'
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM c INTO @a, @b, @v
IF (@@FETCH_STATUS <> 0) BREAK;
SET @sqlcmd = @sqlcmd + (' UNION ALL SELECT ' + @v + ' FROM (SELECT CAST(' + CAST(@a as varchar) + ' AS DECIMAL(10,2)) as a, CAST(' + CAST(@b as varchar) + ' AS DECIMAL(10,2)) as b) t')
END
PRINT @sqlcmd
EXEC (@sqlcmd)
CLOSE c
DEALLOCATE c