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

Pom*_*ter 41 sql sql-server select columnname find

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

我可以写一些类型的SELECT语句来获取从我的表中引用此列的所有过程名称吗?

huM*_*pty 54

一种选择是创建脚本文件.

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

然后,您可以选择所有存储过程并生成包含所有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
Run Code Online (Sandbox Code Playgroud)

SQL SERVER - 查找存储过程中使用的列 - 搜索列名称的存储过程


Aka*_* KC 26

如果您只想使用特定列获取存储过程,可以使用try this query:

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';
Run Code Online (Sandbox Code Playgroud)


Mil*_*vic 22

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

在此输入图像描述

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

  • 这不仅仅提供特定 SP 中名为 FirstName 的列,而是提供任何 SP 中的列。这很好,直到您在多个表、视图中使用相同的列名,......我知道没有任何工具可以找到引用特定列的每个位置。 (3认同)

Mat*_*att 6

您可以使用其中包含的系统视图通过一个脚本在表视图和(未加密的)存储过程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
Run Code Online (Sandbox Code Playgroud)

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

请注意,如果您只想显示 SP 名称,则可以设置@DisplaySPSource0,如果您只是查找表/视图,而不是 SP,则可以设置@SearchSP0

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

示例结果

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


LinqPad用户:在C#中,你可以使用dc.ExecuteQueryDynamic(sqlQueryStr, new object[] {... parameters ...} ).Dump();并具有参数@p0...@pn查询字符串内。然后您可以编写一个静态扩展类并将其保存在My Extensions 下,以便在您的 LinqPad 查询中使用。数据上下文可以作为DataContextBase dcvia 参数从查询窗口传递,即public static void SearchDialog(this DataContextBase dc, string searchString = "%")在公共静态扩展类内部(在 LinqPad 6 中,它是DataContext)。然后,您可以将上面的 SQL 查询重写为带有参数的字符串,并从 C# 上下文中调用它。