急求SQL

fyming 2018-11-20 01:26:06
CREATE TABLE #(W1 INT,W2 INT,W3 INT,W4 INT,S NVARCHAR(30))

INSERT INTO #(W1,W2,W3,S)
SELECT 1,2,3,'W1+W2' UNION ALL
SELECT 1,1,1,'W2+W3' UNION ALL
SELECT 1,0,0,'W1*20+W2+W3-5'
---------------
说明,S为公式,根据公式得到结果并赋值给W4,希望得到结果:

W1 W2 W3 W4 S
1 2 3 3 ‘W1+W2’
1 1 1 2 'W2+W3'
1 0 0 15 'W1*20+W2+W3-5'
-----------------------------
多谢!!!
...全文
991 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyg_123 2018-11-26
  • 打赏
  • 举报
回复

CREATE TABLE [dbo].[S_SELECT](
[ID] [int] IDENTITY(1,1) NOT NULL,
[W1] [nvarchar](50) NULL,
[W2] [nvarchar](50) NULL,
[W3] [nvarchar](50) NULL,
[W4] [nvarchar](50) NULL,
[S] [nvarchar](max) NULL,
CONSTRAINT [PK_S_SELECT_1] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[S_SELECT] ON
INSERT [dbo].[S_SELECT] ([ID], [W1], [W2], [W3], [W4], [S]) VALUES (1, N'1', N'1', N'9', N'11', N'W1+W2+W3')
INSERT [dbo].[S_SELECT] ([ID], [W1], [W2], [W3], [W4], [S]) VALUES (2, N'5', N'6', N'7', N'37', N'-W1+W2*W3')
SET IDENTITY_INSERT [dbo].[S_SELECT] OFF



declare @A nvarchar(100)
declare @B int
declare @num int
set @num = ( select COUNT(*) from dbo.S_SELECT)-- print @num
declare @d nvarchar(100)
declare @dd nvarchar(100)
DECLARE @ID INT
declare @i int
set @i = 1
while(@i<=@num)
begin
exec select_ @i,@d output

if((select CHARINDEX('w1',@d))>0)
begin
set @d =( select REPLACE(@d,'w1',(( SELECT W1 from (select *,ROW_NUMBER()over(order by ID)as num FROM S_SELECT)as B where B.num=@i))))
end
--print @sql

--declare @sql nvarchar(100)='w1+w2'
if((select CHARINDEX('w2',@d))>0)
begin
set @d =( select REPLACE(@d,'w2',( SELECT W2 from (select *,ROW_NUMBER()over(order by ID)as num FROM S_SELECT)as B where B.num=@i)))
end

if((select CHARINDEX('w3',@d))>0)
begin
set @d =( select REPLACE(@d,'w3',(( SELECT W3 from (select *,ROW_NUMBER()over(order by ID)as num FROM S_SELECT)as B where B.num=@i))))
end
print @d

set @A=@d
set @A=N'set @B=' + @A

exec sp_executesql @A,N'@B int output', @B output
print @B
update S_SELECT set W4 = @B WHERE ID = (SELECT ID from (select *,ROW_NUMBER()over(order by ID)as num FROM S_SELECT)as B where B.num=@i)
set @i = @i+1
end

SELECT * FROM S_SELECT

education520 2018-11-24
  • 打赏
  • 举报
回复
delete from cusDecStatusData where 1=1
--先锁定所有记录数大于1的数据
and entryId in(select entryId from cusDecStatusData group by entryId having count(entryId)>1)
--再锁定日期最大的那笔数据,如果有序列ID,用ID来区分先后最好了
and AddTime in(select max(AddTime) from cusDecStatusData group by entryId having count(entryId)>1)
吉普赛的歌 版主 2018-11-20
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL 
	DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1) PRIMARY KEY
	, W1 INT
	,W2 INT
	,W3 INT
	,W4 INT
	,S NVARCHAR(30)
)
--
INSERT INTO t(W1,W2,W3,S)
SELECT 1,2,3,'W1+W2' UNION ALL
SELECT 1,1,1,'W2+W3' UNION ALL
SELECT 1,0,0,'W1*20+W2+W3-5'
GO
IF OBJECT_ID('Proc_Cal') IS NOT NULL 
	DROP PROC Proc_Cal
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE dbo.Proc_Cal
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @i INT,@imax INT,@w1 INT,@w2 INT,@w3 INT,@w4 int,@s NVARCHAR(MAX)
	SELECT @i=1,@imax=MAX(id) FROM t
	DECLARE @r TABLE (w4 INT)
	
	WHILE @i<=@imax
	BEGIN
		IF NOT EXISTS(SELECT 1 FROM t WHERE id=@i)
		BEGIN
			SET @i=@i+1;
			CONTINUE;
		END
		
		SELECT @w1=w1,@w2=w2,@w3=w3,@s=s FROM t WHERE id=@i
		SET @s='select @w4='+REPLACE(@s,'W','@w');
		EXEC sp_executesql @s,N'@w1 int,@w2 int,@w3 int,@w4 int out',@w1,@w2,@w3,@w4 OUT;
		
		UPDATE t SET w4=@w4 WHERE id=@i;
		SET @i=@i+1
	END
END
GO

--执行更新
EXEC Proc_Cal

--查询
SELECT * FROM t
/*
id          W1          W2          W3          W4          S
----------- ----------- ----------- ----------- ----------- ------------------------------
1           1           2           3           3           W1+W2
2           1           1           1           2           W2+W3
3           1           0           0           15          W1*20+W2+W3-5
*/
二月十六 版主 2018-11-20
  • 打赏
  • 举报
回复
DECLARE @sql nvarchar(max)=''
DECLARE CUR_B CURSOR FORWARD_ONLY FOR
SELECT 'UPDATE # SET W4 = ' + S + ' FROM B WHERE CURRENT OF CUR_B'
FROM #
;
OPEN CUR_B;
WHILE 1 = 1
BEGIN
FETCH CUR_B INTO @sql;
IF NOT @@FETCH_STATUS = 0 BREAK;
EXEC(@sql);
END;
CLOSE CUR_B; DEALLOCATE CUR_B;

SELECT * FROM #


34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧