0

下面sql如何执行下面的过程;因为当我尝试在 SSMS 上执行它时,每个项目大约需要 15 秒,但是,当放入 sql 代理作业时,几乎需要一生的时间才能给出输出。

ForProcessing is a list of items

OPEN ForProcessing
FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate
WHILE @@FETCH_STATUS = 0
BEGIN

    -- EOD for S1 FILE (MMS FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'S1FILE')
    BEGIN
        execute rmw_eod_S1_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END
    -- EOD for SL FILE (CSA FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'SLFILE')
    BEGIN
        execute rmw_eod_SL_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END
    -- EOD for C FILE (CSA FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'CFILE')
    BEGIN
        execute rmw_eod_C_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END

    FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate
END

如果我要单独创建函数而不是使用一个调用这些过程的大脚本,它会显着提高性能吗?

任何建议进入这个?或者如何优化这种程序?

编辑:

与我的这个问题有点相关,在执行的过程中我发现了 ff: 关注

DECLARE @a, @b, @c, @d, @e, etc... --the list grows 
SELECT @a = field2 from Parameters where field1 = 'UserName'
SELECT @b = field2 from Parameters where field1 = 'Name'
SELECT @c = field2 from Parameters where field1 = 'CompanyCode'
SELECT @d = field2 from Parameters where field1 = 'MachineNo'
SELECT @e = field2 from Parameters where field1 = 'Type'

正如我在这里问的那样

我希望就如何优化它提出建议,是否有更好的方法,例如定义一个表,然后定义字段,然后查询一个 1 倍大的时间选择等。

如果有人也可以给我一个很好的选择如何在下一个或同时摆脱 fetch ,请这样做。

4

1 回答 1

0

正如 Rory Hunter 所说,您不会在光标中前进。

称呼

FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate

再次作为循环中的最后一条语句,否则你会得到一个无限循环

于 2013-05-29T12:57:40.083 回答