你可以尝试这个方法。虽然它可能不完全适用于架构(下面有所有者名称),因为它更多是基于我使用SQL Server 2000时的情况,但我在2008年进行了测试,它基本上在所有过程、函数和视图上运行alter语句。将PRINT @objName + ' seems valid.'注释掉,只查看无效的过程、函数和视图... 随意编辑任何你想修改的部分!
DECLARE @objId INT
DECLARE @objName NVARCHAR(max)
DECLARE @owner NVARCHAR(255)
DECLARE @Def nvarchar(max)
DECLARE checker CURSOR FAST_FORWARD FOR
SELECT
id, name, USER_NAME(o.uid) owner
FROM sysobjects o
WHERE o.type IN ('P', 'TR', 'V', 'TF', 'FN', 'IF')
AND o.name <> 'RecompileSQLCode'
OPEN checker
FETCH FROM checker INTO @objId, @objName, @owner
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @Def = definition
FROM sys.sql_modules
WHERE object_id = @objId
SET @def = REPLACE(@def, 'create procedure','alter procedure')
SET @def = REPLACE(@def, 'create PROC','alter PROC')
SET @def = REPLACE(@def, 'create trigger','alter trigger')
SET @def = REPLACE(@def, 'create function','alter function')
SET @def = REPLACE(@def, 'create view','alter view')
BEGIN TRANSACTION
BEGIN TRY
EXEC sp_executesql @def
PRINT @objName + ' seems valid.'
END TRY
BEGIN CATCH
PRINT 'Error: ' + @objName + ' : ' + CONVERT(nvarchar(10), ERROR_NUMBER()) + ' ' + ERROR_MESSAGE()
END CATCH
ROLLBACK
FETCH NEXT FROM checker INTO @objId, @objName, @owner
END
CLOSE checker
DEALLOCATE checker
sp_refreshsqlmodule
返回0没有任何问题。 - Andriy M