SqlServer 添加列并赋值

有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走:

  1. 添加列
  2. 赋值

两个功能都不难,很快实现。


	--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

表示真的比我写的简洁多了 -_-#

原文地址:https://www.cnblogs.com/grj1046/p/5287311.html