2017-04-11 1 views
-1

私は立ち往生しています - 私は一緒にまとめたこの素敵なテキスト検索者を持っています。私のストアドプロシージャのテキスト検索はバグです

私は、ストアドプロシージャが格納されている個々のテキストブロックのlniesをカウントする必要があることを知っていました。私はそれを行う方法を考え出したと思います。

しかし、ストアドプロシージャ内の検索用語のすべてのインスタンスを取得しているわけではありません。同じ理由だと思います。検索用語はテキスト境界に分割されています。

私はクエリを変更する方法を見てきました。空白になります。それを変更するために必要なスキルは私の外です!

--Text searcher. 
DECLARE @searchString VARCHAR(255), 
     @doesNotContain VARCHAR(255), 
     @previewLength INTEGER, 
     @findStoredProcedures VARCHAR(3), 
     @findTableFunction VARCHAR(3), 
     @findScalerFunction VARCHAR(3), 
     @findTrigger VARCHAR(3), 
     @findView VARCHAR(3), 
     @findUserTable VARCHAR(3), 
     @onlyInName VARCHAR(3) 

--------------------------------------------------------  
-- Search criteria: 

SET @searchString = 'My search Term' 

SET @findStoredProcedures  = 'yes' 
SET @findTableFunction  = 'yes' 
SET @findScalerFunction  = 'yes' 
SET @findUserTable   = 'yes' 
SET @findTrigger    = 'yes' 
SET @findView     = 'yes' 

SET @doesNotContain = '' 
SET @previewLength = 30 

--------------------------------------------------------  

SELECT DISTINCT 
    ISNULL(
     (SELECT REPLACE(CONVERT(VARCHAR(20), (CAST(SUM(LEN(SC2.text)) AS MONEY)), 1), '.00', '') 
     FROM syscomments SC2 WHERE SC2.id = SO.id GROUP BY SC2.id) 
     , '') 
    AS [Object length] 
    , 
    SO.name AS [Object name] 
    , 
    CASE 
      WHEN SO.xtype = 'P' THEN 'Stored Procedure' 
      WHEN SO.xtype = 'TF' THEN 'Table Function' 
      WHEN SO.xtype = 'FN' THEN 'Scaler Function' 
      WHEN SO.xtype = 'U' THEN 'User Table' 
      WHEN SO.xtype = 'TR' THEN 'Trigger' 
      WHEN SO.xtype = 'V' THEN 'View' 
    END 
    + ISNULL((SELECT ' - ' + name FROM sysobjects WHERE id = SO.parent_obj), '') 
    AS [Object type] 
    , 
    ISNULL(SUBSTRING(SC.text, CHARINDEX(@searchString, SC.text) - @previewLength, @previewLength) + 
      SUBSTRING(SC.text, CHARINDEX(@searchString, SC.text), @previewLength + LEN(@searchString)) 
    , '') AS [Preview of code] 
    , 
    (SELECT 
     COALESCE(
      SUM(LEN(SC3.text) - LEN(REPLACE(SC3.text, CHAR(13), '')) + 1) + 4 
      + 
      (
      SELECT 
       (LEN(LEFT(SC4.text, CHARINDEX(@searchString, SC4.text))) - 
       LEN(REPLACE(LEFT(SC4.text, CHARINDEX(@searchString, SC4.text)), CHAR(13), ''))) 
      FROM syscomments SC4 
      WHERE 
       SC4.id = SO.id 
       AND SC4.colid = SC.colid 
      ) 
     , 
      SUM(LEN(SC3.text) - LEN(REPLACE(SC3.text, CHAR(13), '')) + 1) + 4 
     , 
      (
      SELECT 
       (LEN(LEFT(SC4.text, CHARINDEX(@searchString, SC4.text))) - 
       LEN(REPLACE(LEFT(SC4.text, CHARINDEX(@searchString, SC4.text)), CHAR(13), '')) + 1) 
      FROM syscomments SC4 
      WHERE 
       SC4.id = SO.id 
       AND SC4.colid = SC.colid 
      ) 
     ) 
    FROM syscomments SC3 
    WHERE 
     SC3.id = SO.id 
     AND SC3.colid < SC.colid 
    ) 
    AS [Line number] 

FROM sysobjects SO 

LEFT JOIN syscomments SC 
ON SO.id = SC.id 

WHERE 
    (
     (SO.type = 'P' AND @findStoredProcedures = 'yes') 
     OR 
     (SO.type = 'TF' AND @findTableFunction = 'yes') 
     OR 
     (SO.type = 'FN' AND @findScalerFunction = 'yes') 
     OR 
     (SO.type = 'TR' AND @findTrigger = 'yes') 
     OR 
     (SO.type = 'U' AND @findUserTable = 'yes') 
     OR 
     (SO.type = 'V' AND @findView = 'yes') 
    ) 
    AND SO.category = 0 
    AND 
    (
     (CHARINDEX(@searchString, SC.text) > 0 
     AND CHARINDEX(@doesNotContain, SC.text) = 0) 
     OR 
     (SO.type = 'U' 
     AND CHARINDEX(@searchString, SO.name) > 0 
     AND CHARINDEX(@doesNotContain, SO.name) = 0) 
    ) 
ORDER BY 
    [Object type], [Object name], [Line number] 

答えて

0

ここにあなたの句が問題を持っているようだ、このビット

(
    (CHARINDEX(@searchString, SC.text) > 0 
    AND CHARINDEX(@doesNotContain, SC.text) = 0) 
    --OR 
    --(SO.type = 'U' 
    --AND CHARINDEX(@searchString, SO.name) > 0 
    --AND CHARINDEX(@doesNotContain, SO.name) = 0) 
関連する問題