@@ -471,23 +471,33 @@ def limitQuery(self, num, query, field):
471471 limitedQuery += "=%d" % (num + 1 )
472472
473473 elif kb .dbms == "Microsoft SQL Server" :
474+ forgeNotIn = True
475+
474476 if " ORDER BY " in limitedQuery :
475477 limitedQuery = limitedQuery [:limitedQuery .index (" ORDER BY " )]
476478
477- if not limitedQuery .startswith ("SELECT TOP " ) and not limitedQuery .startswith ("TOP " ):
479+ if limitedQuery .startswith ("SELECT TOP " ) or limitedQuery .startswith ("TOP " ):
480+ topNums = re .search (queries [kb .dbms ].limitregexp , limitedQuery , re .I )
481+
482+ if topNums :
483+ topNums = topNums .groups ()
484+ quantityTopNums = topNums [0 ]
485+ limitedQuery = limitedQuery .replace ("TOP %s" % quantityTopNums , "TOP 1" , 1 )
486+ startTopNums = topNums [1 ]
487+ limitedQuery = limitedQuery .replace (" (SELECT TOP %s" % startTopNums , " (SELECT TOP %d" % num )
488+ forgeNotIn = False
489+ else :
490+ topNum = re .search ("TOP\s+([\d]+)\s+" , limitedQuery , re .I ).group (1 )
491+ limitedQuery = limitedQuery .replace ("TOP %s " % topNum , "" )
492+
493+ if forgeNotIn == True :
478494 limitedQuery = limitedQuery .replace ("SELECT " , (limitStr % 1 ), 1 )
479495 if " WHERE " in limitedQuery :
480496 limitedQuery = "%s AND %s " % (limitedQuery , field )
481497 else :
482498 limitedQuery = "%s WHERE %s " % (limitedQuery , field )
483499 limitedQuery += "NOT IN (%s" % (limitStr % num )
484500 limitedQuery += "%s %s)" % (field , fromFrom )
485- else :
486- topNums = re .search ("TOP\s+([\d]+)\s+.+?\s+FROM\s+.+?\s+WHERE\s+.+?\s+NOT\s+IN\s+\(SELECT\s+TOP\s+([\d]+)\s+" , limitedQuery , re .I ).groups ()
487- quantityTopNums = topNums [0 ]
488- limitedQuery = limitedQuery .replace ("TOP %s" % quantityTopNums , "TOP 1" , 1 )
489- startTopNums = topNums [1 ]
490- limitedQuery = limitedQuery .replace (" (SELECT TOP %s" % startTopNums , " (SELECT TOP %d" % num )
491501
492502 return limitedQuery
493503
0 commit comments