34,590
社区成员
发帖
与我相关
我的任务
分享
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
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
*/
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 #