有個需求,需要給某張表添加一列並且賦值,分解需求,一共分兩部走:
- 添加列
- 賦值
兩個功能都不難,很快實現。
--add column
alter table Med_Summary_Template
add SummaryTypeID varchar(10);
--set column value
declare @ProgramName varchar(50), @SummaryType varchar(50), @SummaryTypeID varchar(10)
declare Cur_Smmary
cursor for select ProgramName, SummaryType from Med_Summary_Template
open Cur_Smmary
fetch next from Cur_Smmary into @ProgramName, @SummaryType
while @@FETCH_STATUS = 0
begin
select @SummaryTypeID = SummaryTypeID from Med_ProgramSummaryType
where ProgramName = @ProgramName and TypeName = @SummaryType;
if exists (select @SummaryTypeID as t)
begin
update Med_Summary_Template set SummaryTypeID = @SummaryTypeID
where ProgramName = @ProgramName and SummaryType = @SummaryType;
end
fetch next from Cur_Smmary into @ProgramName, @SummaryType
end
close Cur_Smmary
deallocate Cur_Smmary
運行正常。
但由於腳本是需要提供給客戶的,需要能夠重復運行而不能夠報錯,則改為了,如果該列存在,則不進行任何操作。然后加了個if判斷
if not exists(select * from sys.columns where [object_id] = object_id('Med_Summary_Template') and name = 'SummaryTypeID')
begin
--add column and set column value
end
然而很不給力
Msg 207, Level 16, State 1, Line 19
Invalid column name 'SummaryTypeID'.
然后又給兩步操作添加事務,但是SqlServer很不給力,總是報這個錯,要么就是列添加上去了但是沒有添加上數據。查了許久,沒有頭緒,只好去問領導,隨后恍然大悟。原來修改表結構操作和update之類的數據操作是不能存在於一個事務的。然后說我update數據的方式寫的太麻煩,然后直接擼了一個簡單的。#表示第一次見這樣用,新技能get
update Med_Summary_Template
set SummaryTypeID = b.SummaryTypeID
From Med_Summary_Template as a Inner Join Med_ProgramSummaryType as b ON
a.ProgramName=b.ProgramName And a.SummaryType = b.TypeName
完整代碼如下。
go
if not exists(select * from sys.columns where [object_id] = object_id('Med_Summary_Template') and name = 'SummaryTypeID')
alter table Med_Summary_Template add SummaryTypeID varchar(10);
go
update Med_Summary_Template
set SummaryTypeID = b.SummaryTypeID
From Med_Summary_Template as a Inner Join Med_ProgramSummaryType as b ON
a.ProgramName=b.ProgramName And a.SummaryType = b.TypeName
go
表示真的比我寫的簡潔多了 -_-#