目前,我们正在维护TFS中的表和proc更改。
存储过程包括create proc语句和drop proc语句:
IF OBJECT_ID ('ResponseTracking_Get_Requests') IS NOT NULL DROP PROCEDURE ResponseTracking_Get_Requests
GO
CREATE PROCEDURE [dbo].[ResponseTracking_Get_Requests]
( @RequestID int = null)
AS
SELECT
RequestID,
Category,
Title,
DateReceived,
Source,
ResponseRequired,
ResponseDateDue,
ApprovalLevelRequired,
FollowUpDate,
Request,
Status,
Notes,
ClosedDate,
EmployeeID,
CreationDateTime
FROM dbo.Request
Where (@RequestID IS NULL OR Request.RequestID = @RequestID)
随着初始表的更改,我已经检查了表对象是否存在:
IF OBJECT_ID ('Approval') IS NULL
CREATE TABLE [dbo].[Approval](
[RequestID] [int] NULL,
[EmployeeID] [nvarchar](10) NULL,
[CreationDateTime] [datetime2](0) NULL,
[Level] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[DateSent] [datetime2](0) NULL,
[DateApproved] [datetime2](0) NULL,
[Comments] [nvarchar](max) NULL,
[SSMA_TimeStamp] [timestamp] NOT NULL
) ON [PRIMARY]
GO
我需要帮助弄清楚如何在初始create语句之后编写对表的任何修改/更改脚本。对我的proc脚本的任何建议都会很感激。
答案 0 :(得分:0)
如果要在表格中添加新列,您可以尝试以下方式:
if not exists (select * from INFORMATION_SCHEMA.COLUMNS c where c.TABLE_NAME='Foo' and c.COLUMN_NAME='Bar')
alter table Foo add Bar varchar(50) not null
go
这将检查表中是否存在新列,并且只有在数据库模式中找不到该列时才添加它。如果要删除列,可以反转逻辑。
如果您正在更改列定义,那么每次只执行ALTER TABLE Foo ALTER COLUMN Bar ...语句 - 检查模式以确定是否需要更改时没有真正的优势。
还有一点需要提及:删除和重新创建存储过程通常不是一个好主意,因为您将丢失为其配置的任何安全性(例如,授予执行)。我总是发现这种模式是更好的选择:
if not exists (select * from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME='getFoo' and r.ROUTINE_TYPE='PROCEDURE')
exec('create procedure [getFoo] as select [Now]=getdate()')
go
alter procedure [getFoo](@someParam int) as
SELECT *
FROM [Foo]
WHERE SomeValue=@someParam
go
这样做意味着存储过程只创建一次,但每次运行脚本后都会更新。