我希望为我一直在苦苦挣扎的问题提供进一步的帮助,我昨天确实发布了一个类似的问题,但是我认为我所使用的示例对于我想要的而言太复杂了,因此我决定从头开始并编写自己的示例。
如前所述,我有一个包含多个sql语句的表,我想依次运行每个语句,并更新结果和运行代码的时间相同的表。到目前为止,我的代码贯穿每个SQL语句并执行,但我找不到通过执行每个单独的select语句来更新Last_Result的方法,即将值输出到参数,例如@retval OUTPUT甚至如何存储它在具有ID的临时表中,以便以后可以运行单独的更新。 从学习的角度来看,知道如何使用@retval OUTPUT设置参数以及如何直接更新表将是一件好事。谁能说清楚我现在哪里错了,因为现在变得绝望了。
CREATE TABLE [dbo].[Test_Run]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](250) NULL, [Script] [nvarchar](max) NULL, [Last_Result] [nvarchar](100) NULL, [Last_Runtime] [datetime] NULL CONSTRAINT [PK_ID] 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] TEXTIMAGE_ON [PRIMARY] declare @cursor nvarchar(4000) set @cursor = 'declare c_tables cursor fast_forward for select distinct ID, Name, Script from Test_Run order by ID asc ' exec sp_executesql @cursor open c_tables declare @ID varchar(2), @Name varchar(35), @Scripts nvarchar(3000), @Result as varchar(10), @ParmDefinition nvarchar(500), @retval as varchar(10) SET @ParmDefinition = N'@retvalOUT int OUTPUT'; fetch next from c_tables into @ID, @Name, @Scripts while @@fetch_status = 0 begin -- insert into Test_Run(Last_Result) exec sp_executesql @Scripts, N'@ID',@ID;--,@ParmDefinition, @retvalOUT=@retval OUTPUT; -- select @retval fetch next from c_tables into @ID, @Name, @Scripts end close c_tables deallocate c_tables
我认为这可以完成工作(这是一个现场演示):
declare @id int, @sql nvarchar(max), @last_result nvarchar(100), @last_runtime datetime, @params nvarchar(max); SET @params = N'@retvalOUT varchar(max) OUTPUT'; select @id = min(id) from Test_Run; while @id is not null begin select @sql = Script from Test_Run where id = @id; set @sql = 'select @retvalOUT= (' + @sql + ')'; exec sp_executesql @sql, @params, @retvalOUT = @last_result OUTPUT; set @last_runtime = getdate(); update Test_Run set Last_Result = @last_result, Last_Runtime = @last_runtime where id = @id; select @id = min(id) from Test_Run where id > @id; end
我完全删除了游标,并使用了while循环-我猜我不太喜欢游标:-)