将光标更改为CTE

时间:2012-08-07 15:27:33

标签: sql-server sql-server-2008

是否可以将以下光标写入CTE?目前运行需要很长时间。

这是我的代码:

if @ReportSource = 'TAB'

  BEGIN
     DECLARE yr_cursor CURSOR
     FOR
       SELECT YEAR, RouteNum, RampInfo, BeginMeasure, EndMeasure, OriginalRoute, Description, CountyDesc, Incidents from #RptParms

     OPEN yr_cursor;



 FETCH NEXT FROM yr_cursor INTO @Year, @RouteNum, @RampInfo, @BeginMeasure, @EndMeasure, @OriginalRoute, @Description, @CountyDesc, @Incidents;


 WHILE (@@FETCH_STATUS = 0)

   BEGIN 

       SELECT @sql_str_fred = N'SELECT route_number, beg_measure AS MILELOG, AADT_TOTAL AS VMT, end_measure, RCLINK,YEAR
                                FROM VW_FRED_AADT_HIST
                                WHERE route_number = '''+ @RouteNum + '''
                                and YEAR = '''+ @Year + '''
                                and FIPS_AND_COUNTY Like ' + '''%' + @CountyDesc + '''
                                and beg_measure BETWEEN '+ cast(@BeginMeasure as varchar(8)) + ' and ' + cast(@EndMeasure as varchar(8)) + ''




       SELECT @sql_str_fred = N' SELECT * from OPENQUERY(EDWGEARS, ''' + REPLACE(@sql_str_fred, '''', '''''') + ''')' 


                      INSERT #freddata  (ROUTE_NBR , 
                                         MILELOG , 
                                         VMT ,
                                         END_MEASURE ,
                                         RCLINK ,
                                         YEAR )         
                       EXEC sp_ExecuteSQL @sql_str_fred 




               FETCH NEXT FROM yr_cursor INTO @Year, @RouteNum, @RampInfo, @BeginMeasure, @EndMeasure, @OriginalRoute, @Description, @CountyDesc, @Incidents;

             END   

     CLOSE yr_cursor
    DEALLOCATE yr_cursor

END;   

1 个答案:

答案 0 :(得分:0)

假设 #RptParms - 是一个带有pameter值的表并且不是很大...... 然后所有参数可以与查询组合,如下所示:

--  The maximum length of the query string in OPENQUERY is 8 KB !!!
declare
    @sql varchar(max) = '
;WITH lst AS (
    SELECT * FROM (VALUES
--- values ---
    ) aa(rn,yr,dsc,m1,m2)
) SELECT route_number, beg_measure AS MILELOG, AADT_TOTAL AS VMT, end_measure, RCLINK,YEAR
FROM VW_FRED_AADT_HIST lst
WHERE   route_number = lst.rn
    and YEAR = lst.yr
    and FIPS_AND_COUNTY Like lst.dsc
    and beg_measure BETWEEN lst.m1 and lst.m2   
'

    select @sql = REPLACE(@sql, '--- values ---', '--- values ---,
('    + ISNULL('''' + RouteNum                          + '''', 'NULL')     --  rn:     1234 --> '1234' or --> NULL
+ ',' + ISNULL('''' + YEAR                              + '''', 'NULL')     --  yn:     1234 --> '1234'
+ ',' + ISNULL('''%'
        + replace(replace(replace(replace(Description
            , '[', '[[]')
            , '%', '[%]')
            , '_', '[_]')
            , '''', '''''')
        + '''', 'NULL')                                                     --  dsc:    a_b[c]%d'e  --> '%a[_]b[[]c][%]d''e'
+ ',' + ISNULL('''' + cast(BeginMeasure as varchar(8))  + '''', 'NULL')     --  m1:     1234 --> '1234' 
+ ',' + ISNULL('''' + cast(EndMeasure   as varchar(8))  + '''', 'NULL')     --  m2:     1234 --> '1234' 
+ ')')
    from #RptParms

-- print @sql
/*
;WITH lst AS (
    SELECT * FROM (VALUES

--- values ---,
('1234','1234','%a[_]b[[]c][%]d''e','1234','1234'),
('222',NULL,'%abcde','1234','1234'),
(NULL,'1234','%a[_]b[[]c][%]d''e','1234','1234')

    ) aa(rn,yr,dsc,m1,m2)
) SELECT route_number, beg_measure AS MILELOG, AADT_TOTAL AS VMT, end_measure, RCLINK,YEAR
FROM VW_FRED_AADT_HIST, lst
WHERE   route_number = lst.rn
    and YEAR = lst.yr
    and FIPS_AND_COUNTY Like lst.dsc
    and beg_measure BETWEEN lst.m1 and lst.m2   
*/

INSERT #freddata  (ROUTE_NBR, MILELOG, VMT, END_MEASURE, RCLINK, YEAR)
    SELECT * 
    from OPENQUERY(EDWGEARS, @sql)

再一次:   OPENQUERY中查询字符串的最大长度为8 KB !!!

相关问题