我在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将返回这样的错误? 提前谢谢!
答案 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