有没有查询找到包含错误的SP?

时间:2010-10-13 06:19:04

标签: sql sql-server tsql dependencies

我在Sql Server 2008中工作,我的数据库中有一个表的更改。所以我需要知道我使用该表的所有查询,或者我需要知道哪些查询会抛出错误。我已经改变了一些SP工作正常。但是有很多查询可能会导致错误。所以如果有的话可以找到所有查询将返回错误,如找不到表或找不到列。

我通过以下查询获得了正在使用的sp

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%machine_ID%' 
    AND ROUTINE_TYPE='PROCEDURE'

但问题是它会返回包含该名称的所有SP。但是对于某些查询,我更改了名称,但仍然使用'machine_ID'作为别名。所以上面的查询将返回包含的所有SP 'machine_ID'。它可以在SP内部查询中使用,也可以用作参数。那么如何获得由于缺少表格或颜色而导致错误的查询

在某些sp中,它会在执行时显示错误

Invalid object name 'tblMachineryHdr'. 

是否可以知道所有SP将返回这样的错误? 提前谢谢!

3 个答案:

答案 0 :(得分:2)

不确定您是否可以通过几个查询来解决这个问题 - 但是有一些工具可以帮助您实现这一点 - 在您进行更改之前执行此操作尤其有用!

参见例如红门的SQL Dependency Tracker作为选项 - 非常有用!

答案 1 :(得分:1)

尝试此查询:

SELECT [Name]

FROM    SYSCOMMENTS c 

    INNER JOIN 
        SYSOBJECTS o
    ON c.id = o.id

WHERE c.text LIKE '%mytable%'

将'mytable'替换为您已更改的表的名称。这将返回一个数据集,其中包含引用表的所有存储过程和UDF的名称。

PS:在更改名称之前,您可以运行SP_DEPENDS'mytable'来发现依赖项。但是,如果表名已经更改,那么上面的查询仍然有效。

答案 2 :(得分:0)

在SQL Server 2008中,您可以使用sp_refreshsqlmodule查找现有表中的缺失列,并sys.sql_expression_dependencies查找缺少的表。

CREATE DATABASE test20101013
GO

USE test20101013
GO

CREATE PROCEDURE dbo.foo1
AS
SELECT willexist FROM dbo.bar

GO

CREATE PROCEDURE dbo.foo2
AS
SELECT wontexist FROM dbo.bar

GO
/*Returns foo1 and foo2 as table doesn't exist yet*/
SELECT * 
FROM sys.sql_expression_dependencies
WHERE referenced_id IS NULL

GO

CREATE TABLE dbo.bar
(
willexist INT
)
GO

/*Returns nothing as table now exists*/
SELECT * 
FROM sys.sql_expression_dependencies
WHERE referenced_id IS NULL

GO

EXEC sp_refreshsqlmodule 'dbo.foo1' /*Succeeds*/
EXEC sp_refreshsqlmodule 'dbo.foo2' /*Throws Error about missing column*/

GO

USE master
ALTER DATABASE test20101013 SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE test20101013