您可以尝试使用以下脚本。
基本上,它创建了一个Stored Procedure,它作为参数获取对象名称(SP/view/function)和它的alter 命令。存储过程检查“Alter”参数是否会更改现有对象,并且只有当它会运行时才会运行它。
/****** Object: StoredProcedure [dbo].[AlterDbObjectIfNecessary] Script Date: 05/14/2014 09:28:30 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AlterDbObjectIfNecessary]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[AlterDbObjectIfNecessary]
GO
/****** Object: StoredProcedure [dbo].[AlterDbObjectIfNecessary] Script Date: 05/14/2014 09:28:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- create new user-toolset relation/ toolset User
CREATE PROCEDURE [dbo].[AlterDbObjectIfNecessary]
@alterCommand NVARCHAR(MAX) ,
@AlteredObjectname NVARCHAR(MAX)
AS
BEGIN
DECLARE @objId INT
DECLARE @objName NVARCHAR(max)
DECLARE @Def nvarchar(max)
--Getting the ID of the object you want to alter
SELECT
@objId = id, @objName = o.name
FROM sysobjects o
WHERE o.type IN ('P', 'TR', 'V', 'TF', 'FN', 'IF')
AND o.name = @AlteredObjectname
--Getting the later definittion
SELECT @Def = [definition]
FROM sys.sql_modules
WHERE object_id = @objId
--print @objName
--print @def
SET @def = REPLACE(@def, 'create PROC','alter PROC')
SET @def = REPLACE(@def, 'create procedure','alter procedure')
SET @def = REPLACE(@def, 'create function','alter function')
SET @def = REPLACE(@def, 'create view','alter view')
IF UPPER (@def) <> UPPER (@alterCommand)
BEGIN
BEGIN TRY
--PRINT @alterCommand
--Alter the object to new definition
EXEC sp_executesql @alterCommand
PRINT @objName + ' Was Modified'
END TRY
BEGIN CATCH
PRINT 'Error. Failed to modify ' + @objName + ' : ' + CONVERT(nvarchar(10), ERROR_NUMBER()) + ' ' + ERROR_MESSAGE()
END CATCH
END
ELSE
BEGIN
PRINT 'Modification was not required for ' +@objName
END
END
GO
您可以通过以下方式使用它:
DECLARE @alterCommand NVARCHAR(MAX)
DECLARE @AlteredObjectname NVARCHAR(MAX)
SET @AlteredObjectname = 'MyObjectName' -- <Insert here the name of object you want to alter
SET @alterCommand = 'ALTER PROCEDURE [dbo].[MyObjectName]
-- The rest of the alter stattement
'
EXEC AlterDbObjectIfNecessary @AlteredObjectname, @alterCommand