Можете ли вы найти содержимое хранимой процедуры SQL Server 2005?
SQL Server Server 2005. Я смотрю на базу данных, в которой хранится более 500 хранимых процедур, и пытаясь понять тонкости взаимодействия с данными - особенно в отношении того, как они вставляют/изменяют данные. Я надеялся найти функцию поиска "или" найти ", которая будет смотреть на содержимое фактической процедуры. Таким образом, я мог бы выполнить поиск всех процедур, которые вообще что-либо делают с каким-то именем_таблицы. Основные функции поиска SQL Management Studio просматривает открытые файлы, и поиск в файлах только, кажется, находит содержимое, если у меня уже открыт sproc, и даже тогда только в файлах временного типа... \Local Settings\Temp\~ vs1011.sql.
Как сейчас, единственный способ получить базовую процедуру - щелкнуть правой кнопкой мыши и выбрать "изменить" (или Script Сохраненная процедура как = > Создать или изменить). Есть ли более быстрый/простой способ поиска/изучения всех sprocs?
Ответы
Ответ 1
Имеется представление Information_Schema.Routines, которое вы можете использовать.
select *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE OBJECTPROPERTY(OBJECT_ID(SPECIFIC_NAME),'IsMSShipped') =0
and OBJECT_DEFINITION(OBJECT_ID(SPECIFIC_NAME)) like '%search term here%'
AND ROUTINE_TYPE='PROCEDURE'
Ответ 2
Попробуйте использовать сторонние инструменты, такие как ApexSQL Search (бесплатно) или SSMS Toolpack (бесплатно), кроме тех, которые уже упомянуты здесь.
У Ive была аналогичная проблема в прошлом, когда я унаследовал 500+ объектов базы данных. Мой опыт заключается в том, что запросы в порядке, но действительно помогли дополнения сторонних SSMS.
Ответ 3
Не используйте INFORMATION_SCHEMA.ROUTINES. Он отсекает 4000 знаков. Получите это от sys.sql_modules.
SELECT o.type_desc AS ROUTINE_TYPE
,o.[name] AS ROUTINE_NAME
,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON m.object_id = o.object_id
WHERE m.definition LIKE '%search term here%'
(Как написано, это также будет возвращать триггеры, представления и скалярные функции. Исключайте их по типу, если хотите)
Ответ 4
Продукт RedGate SQL Search легко справляется с этим и является бесплатным. http://www.red-gate.com/products/sql-development/sql-search/
Ответ 5
Массовый экспорт в текстовые файлы затем индексирует их с помощью Google Desktop.
Ответ 6
select top 10 * from syscomments
Вы также можете найти sp_grep, который является популярной, хотя и не включенной, процедурой, которая делает это.
Ответ 7
SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet
FROM syscomments (nolock)
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'
Ответ 8
Да.
Ответ 9
введите имя проса, где указано имя места проса.
sp_msforeachdb'SELECT DISTINCT o.name, o.xtype FROM?.dbo.syscomments c INNER JOIN?.dbo.sysobjects o ON c.id = o.id WHERE c.TEXT LIKE ''% Place Proc Name Here% '' '
Ответ 10
Используйте таблицу 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') + '%'
Конечно, вы можете параметризовать место, где я жестко закодировал слово "DELETE". Протестировано в SQL Server 2005.
Ответ 11
Если вам нужен дружественный интерфейс, я могу порекомендовать недорогой SQL-набор инструментов от Idera. В дополнение к другим инструментам он имеет хорошую утилиту поиска SQL, которая находит строки в sprocs (или в другом месте) и помогает вам перемещаться по ним.
Ответ 12
select o.name
from syscomments c
inner join sysobjects o on c.id = o.id
where text like '%tableName%'
Ответ 13
Я использую следующую хранимую процедуру, с которой я столкнулся некоторое время назад:
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: [email protected]
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
Ответ 14
Совершенно иначе, чем в приведенных выше ответах, заключается в написании простой программы, в которой рассматриваются пространства имен 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;
}
}
}
Ответ 15
Я написал модуль Perl, который позволяет мне делать это и многое другое. С его помощью я могу манипулировать представлениями /sprocs (и кодом Perl) с помощью операторов SQL. `#!/Usr/bin/perl
#
используйте Codebase;
использовать строгий;
использовать предупреждения;
Codebase::CreateFunctions(change=>\&change);
exit;
sub change { my $string = shift;
my %H=(
23 => 30,
25 => 26,
27 => 30,
28 => 30,
29 => 30,
31 => 24,
32 => 24
);
$string =~ s/InstallStatus *(<>|==|>=|<=|>|=|<) *(23|25|27|28|29|31|32)(\W)/"iNstallsTatus $1 $H{$2}$3"/iges;
return $string;
} # change
END выберите имя (entries.fullname) || extension (entries.fullname) как имя, grep (m/\ W (23 | 25 | 27 | 28 | 29 | 31 | 32 | InstallStatus | InstallStatusNew | InstallStatusOld)\W/, объекты .definition, 3) как ЛИСТИНГ из записей внутренние объекты объединения на entry.OId = objects.OId где (путь (entries.fullname) in ('BETA:/') и entries.kind = 'view') и (((objects.definition, как m/\ W (TRACKING)\W/) и (objects.definition, как m/\ WInstallStatus (\ W\\ s)/)) или ((objects.definition как m/\ W (TRACKING_LOG)\W/) и (objects.definition, как m/\ WInstallStatus (новый | OLD) (\ W |\s)/))) предел 10
select name(entries.fullname)||extension(entries.fullname) as Name, change(objects.definition) as FILE
from entries
inner join objects on entries.OId = objects.OId
where (path(entries.fullname) in ('BETA:/') and entries.kind = 'view')
and (((objects.definition like m/\W(TRACKING)\W/) and (objects.definition like m/\WInstallStatus(\W|\s)/))
or ((objects.definition like m/\W(TRACKING_LOG)\W/) and (objects.definition like m/\WInstallStatus(New|OLD)(\W|\s)/)))
and (change(objects.definition) <> objects.definition)
limit 10
`
Ответ 16
Использовать MS SQL Server Managment Studio;
Найдите таблицу или SP в TreeView и щелкните ее правой кнопкой мыши и выберите "Просмотр дефенденций"
Таким образом вы можете видеть все зависимые объекты.