ฉันต้องการค้นหา SQL Server 2008 สำหรับขั้นตอนการจัดเก็บที่มีชื่อของเขตข้อมูลฐานข้อมูลหรือชื่อตัวแปร
ฉันต้องการค้นหา SQL Server 2008 สำหรับขั้นตอนการจัดเก็บที่มีชื่อของเขตข้อมูลฐานข้อมูลหรือชื่อตัวแปร
คำตอบ:
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%Foo%'
AND ROUTINE_TYPE='PROCEDURE'
SELECT OBJECT_NAME(id)
FROM SYSCOMMENTS
WHERE [text] LIKE '%Foo%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%Foo%'
คว้าสำเนาของตัวเองได้ฟรี แดงประตู SQL ค้นหาเครื่องมือและเริ่มเพลิดเพลินกับการค้นหาใน SQL Server! :-)
มันเป็นเครื่องมือที่ยอดเยี่ยมและมีประโยชน์มากและใช่! มันฟรีทั้งหมดสำหรับการใช้งานทุกประเภท
คุณยังสามารถลองใช้ApexSQL Search - ปลั๊กอิน SSMS ฟรีจาก ApexSQL
ฉันตอบคำถามของ Kashif และรวมทุกอย่างเข้าด้วยกัน น่าแปลกที่บางครั้งฉันพบผลลัพธ์ในตัวเลือกอย่างใดอย่างหนึ่ง แต่ไม่ใช่ผลลัพธ์ เพื่อความปลอดภัยฉันวิ่งทั้ง 3 เมื่อฉันมองหาบางอย่าง หวังว่านี่จะช่วย:
DECLARE @SearchText varchar(1000) = 'mytext';
SELECT DISTINCT SPName
FROM (
(SELECT ROUTINE_NAME SPName
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%'
AND ROUTINE_TYPE='PROCEDURE')
UNION ALL
(SELECT OBJECT_NAME(id) SPName
FROM SYSCOMMENTS
WHERE [text] LIKE '%' + @SearchText + '%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id))
UNION ALL
(SELECT OBJECT_NAME(object_id) SPName
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName
ในกรณีที่คุณต้องการสคีมาด้วย:
SELECT DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM syscomments AS c
INNER JOIN sys.objects AS o ON c.id = o.[object_id]
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE text LIKE '%foo%'
ORDER BY SCHEMA_NAME(o.schema_id),o.name
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%FieldName%'
AND ROUTINE_TYPE='PROCEDURE'
[whatever]
นั้นจะจับได้whatever
หรือไม่
ฉันลองตัวอย่างด้านบน แต่มันไม่ได้แสดงมากกว่า 4,000 ตัวอักษรจากนั้นฉันแก้ไขมันเล็กน้อยและก็สามารถรับนิยามโพรซีเดอร์ที่เก็บไว้ทั้งหมดได้ โปรดดูสคริปต์ที่อัปเดตด้านล่าง -
SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM SYSCOMMENTS AS C
INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY SCHEMA_NAME(O.SCHEMA_ID), O.NAME
ก่อนอื่นให้แน่ใจว่าคุณกำลังเรียกใช้แบบสอบถามภายใต้ข้อมูลรับรองผู้ใช้ของคุณและในบริบทฐานข้อมูลที่ถูกต้อง
USE YOUR_DATABASE_NAME;
มิฉะนั้น sys.procedures จะไม่ส่งคืนสิ่งใด ตอนนี้เรียกใช้แบบสอบถามดังต่อไปนี้:
select * from sys.procedures p
join sys.syscomments s on p.object_id = s.id
where text like '%YOUR_TEXT%';
อีกตัวเลือกหนึ่งคือการใช้ INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION แต่โปรดทราบว่ามีจำนวนอักขระที่ จำกัด (เช่นตัวอักษร 4000 ตัวแรก) ของรูทีนเท่านั้น
select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';
ฉันทดสอบกับ Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
select * from sys.system_objects
where name like '%cdc%'
นี่คือรุ่นรวมที่ใช้ Losbear ทำ แต่แก้ไขเพื่อให้มันออกชื่อสกีมา:
DECLARE @SearchText varchar(1000) = 'searchtext';
SELECT DISTINCT sc.SPECIFIC_SCHEMA as 'Schema', sp.SPName as 'Name'
FROM (
(SELECT ROUTINE_NAME SPName
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%'
AND ROUTINE_TYPE='PROCEDURE')
UNION ALL
(SELECT OBJECT_NAME(id) SPName
FROM SYSCOMMENTS
WHERE [text] LIKE '%' + @SearchText + '%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id))
UNION ALL
(SELECT OBJECT_NAME(object_id) SPName
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%' + @SearchText + '%')
) AS sp
CROSS APPLY (select SPECIFIC_SCHEMA from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME = sp.SPName) sc
ORDER BY 1
วิธีการค้นหากระบวนงานที่เก็บไว้ประกอบด้วยข้อความหรือสายอักขระ
หลายครั้งที่เราจำเป็นต้องค้นหาข้อความหรือสตริงในขั้นตอนการจัดเก็บ นี่คือแบบสอบถามเพื่อค้นหาข้อความที่มี
SELECT OBJECT_NAME(id)
FROM SYSCOMMENTS
WHERE [text] LIKE '%Text%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบ URL ที่ให้ไว้ด้านล่าง
http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string
สำหรับเซิร์ฟเวอร์ SQL ที่ใหม่กว่าเซิร์ฟเวอร์ SQL 2000:
SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE sm.definition like '%searchString%'
ORDER BY o.type, o.name, o.object_id
หากมีใครบางคนติดอยู่กับเซิร์ฟเวอร์ SQL 2000 ตาราง sql_modules ไม่มีอยู่ดังนั้นคุณจะใช้ syscomments คุณจะได้รับหลายระเบียนสำหรับ procdedures ที่เก็บไว้ที่มีขนาดใหญ่กว่า 4,000 ตัวอักษร แต่พวกเขาจะมีฟิลด์c.numberเหมือนกันดังนั้นคุณจึงสามารถจัดกลุ่มได้ ชิ้นส่วนเข้าด้วยกันเพื่อรับข้อความขั้นตอนการจัดเก็บแบบเต็ม:
Select o.id, c.number, o.name, c.text
from syscomments c
inner join sysobjects o on o.id = c.id
where c.encrypted = 0 and o.type = 'P'
and c.id in
(Select id from syscomments where text like '%searchtext%')
order by objecttype, o.name, o.id, c.number, c.colid
SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE '%FOO%'
create Procedure [dbo].[TextFinder]
(@Text varchar(500),@Type varchar(2)=NULL)
AS
BEGIN
SELECT DISTINCT o.name AS ObjectName,
CASE o.xtype
WHEN 'C' THEN 'CHECK constraint'
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'`enter code here`
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
ELSE o.xtype
END AS ObjectType,
ISNULL( p.Name, '[db]') AS Location
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
LEFT JOIN sysobjects p ON o.Parent_obj=p.id
WHERE c.text LIKE '%' + @Text + '%' and
o.xtype = case when @Type IS NULL then o.xtype else @Type end
ORDER BY Location, ObjectName
END
SELECT s.name + '.' + o.name ProcedureName
, c.text ProcedureSteps
FROM sys.syscomments c
INNER JOIN
sys.objects o
ON
c.id = o.object_id
INNER JOIN
sys.schemas s
ON
o.schema_id = s.schema_id
WHERE o.type = 'P'
AND c.text LIKE N'%XXXX%'
ORDER BY s.name + '.' + o.name
, c.colid
แบบสอบถามนี้ส่งคืนชื่อและเนื้อหาของกระบวนงานที่เก็บไว้ใด ๆ ที่มีการอ้างอิง "XXXX" ภายในกระบวนงานที่เก็บไว้
นี่เป็นการเลิกใช้งานที่มีประโยชน์เมื่อค้นหาโพรซีเดอร์ที่อ้างอิงตาราง / มุมมอง / โพรซีเดอร์เฉพาะ
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'
นี่คือสิ่งที่ฉันเขียนใน SQL 2012 เพื่อเลือกโพรซีเดอร์ที่เก็บไว้ทั้งหมดที่ชื่อเช่น "CompanySpecialisation"
ขั้นตอนการจัดเก็บเพื่อค้นหาข้อความใน SP {Dinesh Baskaran} Trendy Global Systems pvt ltd
create Procedure [dbo].[TextFinder]
(@Text varchar(500),@Type varchar(2)=NULL)
AS
BEGIN
SELECT DISTINCT o.name AS ObjectName,
CASE o.xtype
WHEN 'C' THEN 'CHECK constraint '
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
ELSE o.xtype
END AS ObjectType,
ISNULL( p.Name, '[db]') AS Location
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
LEFT JOIN sysobjects p ON o.Parent_obj=p.id
WHERE c.text LIKE '%' + @Text + '%' and
o.xtype = case when @Type IS NULL then o.xtype else @Type end
ORDER BY Location, ObjectName
END
SELECT OBJECT_NAME(id)
FROM syscomments
WHERE [text] LIKE '%Name%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
ลองนี้ .....
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''
สิ่งนี้จะค้นหาในขั้นตอนการจัดเก็บทั้งหมดของฐานข้อมูลทั้งหมด สิ่งนี้จะทำงานเป็นเวลานาน
ฉันใช้สคริปต์นี้ หากคุณเปลี่ยนความคิดเห็น XML ของคุณเพื่อแสดงเป็นข้อความสีดำบนพื้นหลังสีเหลืองคุณจะได้รับผลของการเน้นข้อความที่คุณต้องการในคอลัมน์ xml ของผลลัพธ์ (เครื่องมือ -> ตัวเลือก -> สภาพแวดล้อม -> แบบอักษรและสี [รายการแสดง: ความคิดเห็น XML]
---------------------------------------------
-------------- Start FINDTEXT ----------
---------------------------------------------
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
GO
DECLARE @SearchString VARCHAR(MAX)
SET @SearchString = 'the text you''re looking for'
DECLARE @OverrideSearchStringWith VARCHAR(MAX)
--#############################################################################
-- Use Escape chars in Brackets [] like [%] to find percent char.
--#############################################################################
DECLARE @ReturnLen INT
SET @ReturnLen = 50;
with lastrun
as (select DEPS.OBJECT_ID
,MAX(last_execution_time) as LastRun
from sys.dm_exec_procedure_stats DEPS
group by deps.object_id
)
SELECT OL.Type
,OBJECT_NAME(OL.Obj_ID) AS 'Name'
,LTRIM(RTRIM(REPLACE(SUBSTRING(REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), ''), CHARINDEX(@SearchString, OBJECT_DEFINITION(OL.Obj_ID)) - @ReturnLen, @ReturnLen * 2), @SearchString, ' ***-->>' + @SearchString + '<<--*** '))) AS SourceLine
,CAST(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')), '&', '(A M P)'), '<', '(L T)'), '>', '(G T)'), @SearchString, '<!-->' + @SearchString + '<-->') AS XML) AS 'Hilight Search'
,(SELECT [processing-instruction(A)] = REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')
FOR
XML PATH('')
,TYPE
) AS 'code'
,Modded AS Modified
,LastRun as LastRun
FROM (SELECT CASE P.type
WHEN 'P' THEN 'Proc'
WHEN 'V' THEN 'View'
WHEN 'TR' THEN 'Trig'
ELSE 'Func'
END AS 'Type'
,P.OBJECT_ID AS OBJ_id
,P.modify_Date AS modded
,LastRun.LastRun
FROM sys.Objects P WITH (NOLOCK)
LEFT join lastrun on P.object_id = lastrun.object_id
WHERE OBJECT_DEFINITION(p.OBJECT_ID) LIKE '%' + @SearchString + '%'
AND type IN ('P', 'V', 'TR', 'FN', 'IF', 'TF')
-- AND lastrun.LastRun IS NOT null
) OL
OPTION (FAST 10)
---------------------------------------------
---------------- END -----------------
---------------------------------------------
---------------------------------------------