查找引用某个表中特定列的所有存储过程

时间:2013-10-23 10:53:32

标签: sql sql-server select find columnname

我在表中有一个意外更改的值。有问题的列是CreatedDate:这是在创建项目时设置的,但是存储过程会更改它。

我是否可以编写某种类型的SELECT语句来获取从我的表中引用此列的所有过程名称?

9 个答案:

答案 0 :(得分:49)

一种选择是创建一个脚本文件。

右键单击数据库 - >任务 - >生成脚本

然后,您可以选择所有存储过程并生成包含所有sps的脚本。所以你可以从那里找到参考资料。

或者

-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'CreatedDate' + '%'
GO

-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'CreatedDate' + '%'
GO

来源SQL SERVER – Find Column Used in Stored Procedure – Search Stored Procedure for Column Name

答案 1 :(得分:25)

如果您只想使用特定列获取存储过程,可以尝试使用此查询:

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';

如果要使用表的特定列获取存储过程,可以使用以下查询:

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';

答案 2 :(得分:22)

您可以使用ApexSQL Search,它是一个免费的SSMS和Visual Studio加载项,它可以列出引用特定表列的所有对象。它还可以查找存储在表和视图中的数据。您可以轻松过滤结果以显示引用列

的特定数据库对象类型

enter image description here

免责声明:我作为支持工程师为ApexSQL工作

答案 3 :(得分:3)

您可以使用 information_schema 中包含的系统视图在表格中搜索观看次数和(未加密的)存储过程,带有一个脚本。我不久前开发了这样一个脚本,因为我需要在数据库中的任何地方搜索字段名称。

下面的脚本首先列出包含您要搜索的列名的表/视图,然后列出找到该列的存储过程源代码。它在一个表中显示结果,区分“BASE TABLE”,“VIEW”和“PROCEDURE”,以及(可选)第二个表中的源代码:

DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code

-- tables
if (@SearchSP=1) begin  
  (
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
            t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  union
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition like @SearchFor
        and routine_type='procedure'
  )
  order by table_type, schema_object
end else begin
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
         t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  order by c.table_Name, c.column_name
end     
-- stored procedure (source listing)
if (@SearchSP=1) begin      
    if (@DisplaySPSource=1) begin
      select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
      from information_schema.routines
      where routine_definition like @SearchFor
      and routine_type='procedure'
      order by routine_name
    end
end

如果运行查询,请使用“结果为文本”选项 - 然后您可以使用“查找”在结果集中找到搜索文本(对于长源代码很有用)。

注意如果您只想显示SP名称,并且只是在查找表/视图,则可以将@DisplaySPSource设置为0,但不是对于SP,您可以将@SearchSP设置为0

示例结果(在Northwind数据库中查找CustomerID,通过LinqPad显示结果):

Sample Result

注意我已使用测试视图dbo.TestOrders验证了此脚本 并且它在此视图中找到了CustomerID,即使c.*语句中使用了SELECT(引用表Customers包含CustomerID,因此视图显示这一栏)。

答案 4 :(得分:1)

试试这个..

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO

或者您可以生成所有程序的脚本并从那里搜索。

答案 5 :(得分:1)

我遇到了同样的问题,我发现 Microsoft 有一个显示dependencies systable

SELECT 
    referenced_id
    , referenced_entity_name AS table_name
    , referenced_minor_name as column_name
    , is_all_columns_found
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT'); 

这适用于ViewsTriggers

答案 6 :(得分:0)

  

您可以使用以下查询来标识值。但请记住,这不会从加密存储过程中获得结果。

SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
    ,objects.type_desc
FROM syscomments comments
    ,sys.objects objects
WHERE comments.id = objects.object_id
    AND TEXT LIKE '%CreatedDate%'
ORDER BY 1

答案 7 :(得分:0)

-搜索所有对象

SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'ColumnName' + '%'
GO

-仅在存储过程中搜索

SELECT DISTINCT OBJECT_NAME(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'ColumnName' + '%'
GO

答案 8 :(得分:-1)

SELECT *
FROM   sys.all_sql_modules
WHERE  definition LIKE '%CreatedDate%'