2010-10-13 62 views
4

我在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但问题是,它会返回所有的SP是包含name.But为某些查询我改了名字,但仍然使用'machine_ID'作为别名。因此,上面的查询将返回所有包含'machine_ID'的SP。它可以用于SP中的查询,或者可以用作参数。那么我怎样才能得到将导致由于缺少表格或颜色导致的错误

在某些sp中,显示执行时出现如下错误

Invalid object name 'tblMachineryHdr'. 

是否有可能知道所有的SP会返回这样的错误? 在此先感谢!

回答

2

不确定您是否可以仅通过几个查询就知道这一点 - 但有些工具可以帮助您做到这一点 - 在您做出更改之前做到这一点特别有用!

参见例如Red Gate的SQL Dependency Tracker作为一个选项 - 非常有用!

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'来发现依赖关系。但是,如果表名已被更改,那么上面的查询应该仍然有效。

0

在SQL Server 2008中,您可以使用​​查找现有表中缺失的列和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 
相关问题