Можете ли вы искать содержимое хранимой процедуры SQL Server 2005? - PullRequest
25 голосов
/ 21 января 2009

SQL Server Server 2005. Я смотрю на базу данных, в которой хранится более 500 хранимых процедур, и пытаюсь выяснить тонкости их взаимодействия с данными, особенно в отношении того, как они вставляют / изменяют данные. Я надеялся найти функцию поиска или поиска, которая бы смотрела на содержание фактической процедуры. Таким образом, я мог бы выполнить поиск всех процедур, которые вообще что-либо делают с some_table_name. Базовая функция поиска SQL Management Studio выполняет поиск в открытых файлах, а функция «Поиск в файлах» появляется только для поиска содержимого, если у меня уже есть sproc, и даже тогда только во временных файлах типа ... \ Local Settings \ Temp \ ~ vs1011.sql.

На данный момент единственный известный мне способ добраться до базовой процедуры - это щелкнуть правой кнопкой мыши и выбрать «изменить» (или «Хранимая процедура сценария как => Создать или Изменить»). Есть ли более быстрый / простой способ поиска / изучения всех звезд?

Ответы [ 16 ]

0 голосов
/ 21 января 2009

Совершенно отличающийся от вышеприведенных ответов способ - написать простую программу, использующую пространства имен Microsoft.SqlServer.Management.Smo и Microsoft.SqlServer.Management.Common Используя их, вы можете перебирать все хранимые процедуры и читать текст из них. Я написал программу для сравнения процедур хранения в двух разных базах данных (dev и stage или stage и production) и обновил разные.

Вот пример:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SqlObjectChecker
{
    internal class ProcedureUpdater
    {
        internal string UpdateProcedure(string spName, string devConnString, string prodConnString, bool updateDev)
        {
            string returnMessage = "";

            ServerConnection devConnection = new ServerConnection();
            devConnection.ConnectionString = devConnString;
            ServerConnection prodConnection = new ServerConnection();
            prodConnection.ConnectionString = prodConnString;

            try
            {
                devConnection.Connect();
                prodConnection.Connect();

                Server devServer = new Server(devConnection);
                Server prodServer = new Server(prodConnection);

                Database devDatabase = devServer.Databases["Dbname"];
                Database prodDatabase = prodServer.Databases["Dbname"];

                StoredProcedure devStoredProcedure = devDatabase.StoredProcedures[spName];
                if (devStoredProcedure != null)
                {
                    StoredProcedure prodStoredProcedure = prodDatabase.StoredProcedures[spName];
                    if (prodStoredProcedure != null)
                    {
                        if (updateDev)
                        {
                            devStoredProcedure.TextHeader = prodStoredProcedure.TextHeader;
                            devStoredProcedure.TextBody = prodStoredProcedure.TextBody;
                            devStoredProcedure.Alter();
                            returnMessage = "Dev updated";
                        }
                        else
                        {
                            prodStoredProcedure.TextHeader = devStoredProcedure.TextHeader;
                            prodStoredProcedure.TextBody = devStoredProcedure.TextBody;
                            prodStoredProcedure.Alter();
                            returnMessage = "Prod updated.";
                        }
                    }
                    else
                    {
                        returnMessage = "Prod Stored Procedure Name Found.";
                    }
                }
                else
                {
                    returnMessage = "Dev Stored Procedure Name Found.";
                }

                devConnection.Disconnect();
                prodConnection.Disconnect();
            }
            catch (Exception exception)
            {
                returnMessage = exception.Message;
            }

            return returnMessage;
        }
    }
}
0 голосов
/ 21 января 2009

Я использую следующую хранимую процедуру, с которой я столкнулся некоторое время назад:

 CREATE PROC dbo.sp_search_code  
(  
@SearchStr  varchar(100),  
@RowsReturned int = NULL OUT  
)  
AS  
/*************************************************************************************************  
  Copyright © 1997 - 2002 Narayana Vyas Kondreddi. All rights reserved.  

Purpose: To search the stored proceudre, UDF, trigger code for a given keyword.  

Written by: Narayana Vyas Kondreddi  
  http://vyaskn.tripod.com  

Tested on:  SQL Server 7.0, SQL Server 2000  

Date created: January-22-2002 21:37 GMT  

Date modified: February-17-2002 19:31 GMT  

Email:   vyaskn@hotmail.com  

Examples:  

To search your database code for the keyword 'unauthorized':  
EXEC sp_search_code 'unauthorized'  

To search your database code for the keyword 'FlowerOrders' and also find out the number of hits:  
DECLARE @Hits int  
EXEC sp_search_code 'FlowerOrders', @Hits OUT  
SELECT 'Found ' + LTRIM(STR(@Hits)) + ' object(s) containing this keyword' AS Result  
*************************************************************************************************/  
BEGIN  
 SET NOCOUNT ON  

 SELECT DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',  
  CASE   
    WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1   
    THEN 'Replication stored procedure'  
    WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1   
    THEN 'Extended stored procedure'      
   WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1   
    THEN 'Stored Procedure'   
   WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1   
    THEN 'Trigger'   
   WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1   
    THEN 'Table-valued function'   
   WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1   
    THEN 'Scalar-valued function'  
    WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
    THEN 'Inline function'   
  END AS 'Object type',  
  'EXEC sp_helptext ''' + USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) + '''' AS 'Run this command to see the object text'  
 FROM syscomments c  
  INNER JOIN  
  sysobjects o  
  ON c.id = o.id  
 WHERE c.text LIKE '%' + @SearchStr + '%' AND  
  encrypted = 0    AND  
  (  
  OBJECTPROPERTY(c.id, 'IsReplProc') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsProcedure') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTrigger') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
  )  

 ORDER BY 'Object type', 'Object name'  

 SET @RowsReturned = @@ROWCOUNT  
END  
0 голосов
/ 21 января 2009

Использование MS SQL Server Managment Studio;

Найдите таблицу или SP в TreeView, щелкните по ней правой кнопкой мыши и выберите «Просмотреть зависимости»

Таким образом, вы можете видеть все зависимые объекты.

0 голосов
/ 21 января 2009
select o.name 
from syscomments c
    inner join sysobjects o on c.id = o.id
where text like '%tableName%'
0 голосов
/ 21 января 2009

Если вам нужен дружественный интерфейс, я могу порекомендовать недорогой набор инструментов администрирования SQL от Idera. В дополнение к другим инструментам у него есть хорошая утилита поиска SQL, которая находит строки в sprocs (или где-либо еще) и помогает вам перемещаться по ним.

0 голосов
/ 21 января 2009

Использовать таблицу INFORMATION_SCHEMA.ROUTINES.

В этой таблице поле ROUTINE_DEFINITION содержит текст ваших хранимых процедур.

SELECT
  R.SPECIFIC_NAME
 ,R.ROUTINE_DEFINITION
FROM
  MyDatabase.INFORMATION_SCHEMA.ROUTINES R
WHERE UPPER(R.ROUTINE_DEFINITION) LIKE '%' + UPPER('DELETE') + '%'

Конечно, вы можете параметризовать место, где я жестко закодировал слово "УДАЛИТЬ". Протестировано в SQL Server 2005.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...