27,579
社区成员
发帖
与我相关
我的任务
分享
--表结构
CREATE TABLE [dbo].#t1
(
T DECIMAL(18, 2),
L DECIMAL(18, 2),
A DECIMAL(18, 2),
Q INT,
公式 NVARCHAR(999),
值 DECIMAL(18, 2)
);
--数值
INSERT INTO #t1(T,L,A,Q,公式)VALUES( 3200,3840, 3300,5,'CASE WHEN A<=T THEN Q WHEN A<L THEN Q*(L-A)/(L-T) ELSE 0 END' )
INSERT INTO #t1(T,L,A,Q,公式)VALUES( 8,10, 0,5,'CASE WHEN A<=T THEN Q WHEN A<L THEN Q*(L-A)/L ELSE 0 END' )
--变量
DECLARE @i INT, @n INT;
DECLARE @gs VARCHAR(500);
DECLARE @sql VARCHAR(MAX);
--按公式类别分类
SELECT ROW_NUMBER() OVER (ORDER BY 公式) rowid, 公式 INTO #tt FROM #t1 GROUP BY 公式;
--按公式类别遍历
SELECT @i = MIN(rowid), @n = MAX(rowid)FROM #tt;
WHILE (@i <= @n)
BEGIN
SELECT @gs = 公式 FROM #tt WHERE rowid = @i;
SET @sql = 'update #t1 set 值=' + @gs + ' where 公式=''' + @gs + ''''; --生成脚本
EXEC (@sql); --执行脚本,可以print看效果
SET @i = @i + 1;
END;
SELECT * FROM #t1;
DECLARE @SQL VARCHAR(8000)
DECLARE @ID INT
SET @ID=2
;WITH CTE
AS
(SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM #T1)
SELECT @SQL='WITH CTE
AS
(SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM #T1)
UPDATE CTE SET 值='+公式+' WHERE RN='+CAST(@ID AS VARCHAR)
FROM CTE WHERE RN=@ID
EXEC(@SQL)
-- 计算
declare @t decimal(18,2),@l decimal(18,2),@a decimal(18,2),@q int,@gs nvarchar(999),
@tsql nvarchar(2000)
declare ap scroll cursor for
select T,L,A,Q,公式 from #t1
open ap
fetch first from ap into @t,@l,@a,@q,@gs
while(@@fetch_status<>-1)
begin
select @tsql=N'update #t1 set 值='+@gs
+N' where T='+cast(@t as nvarchar(100))
+N' and L='+cast(@l as nvarchar(100))
+N' and A='+cast(@a as nvarchar(100))
+N' and Q='+cast(@q as nvarchar(100))
exec(@tsql)
fetch next from ap into @t,@l,@a,@q,@gs
end
close ap
deallocate ap
-- 结果
select * from #t1