SQL:如何使用刚刚添加的列

时间:2010-06-10 14:00:06

标签: sql

我正在尝试添加2列,然后我想为它们设置一些值但是我得到一个编译错误,说该列不存在。我使用以下脚本:

IF @LogProcessed = 0
Begin

IF NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'SYSTM_FRM' and column_name = 'SF_Ip_TXT')
ALTER TABLE SYSTM_FRM add SF_Ip_TXT NVARCHAR(20)

IF NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'SYSTM_FRM' and column_name = 'SF_Port_NUM')
ALTER TABLE SYSTM_FRM add SF_Port_NUM int


IF  (EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'FRM' and column_name = 'FRM_Ip_TXT') AND
    EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'FRM' and column_name = 'FRM_Ip_TXT'))
begin
Update dbo.SYSTM_FRM
SET     dbo.SYSTM_FRM.SF_Ip_TXT = dbo.FRM.FRM_Ip_TXT,
        dbo.SYSTM_FRM.SF_Port_NUM = dbo.FRM.FRM_Port_NUM

FROM dbo.FRM INNER JOIN dbo.SYSTM_FRM ON dbo.FRM.FRM_RCRD_NUM = dbo.SYSTM_FRM.SF_FrameRecord_NUM          

ALTER TABLE FRM DROP COLUMN FRM_Ip_TXT
ALTER TABLE FRM DROP COLUMN FRM_Port_NUM  
  end


Update [Update_Log]
Set Update_Log_Processed = 1
Where [Update_Log_Version] = '00001'

有没有办法使用我在同一个脚本中添加的列?

3 个答案:

答案 0 :(得分:4)

GO置于

之间

答案 1 :(得分:3)

你无法将其保存在那样的过程中

例如

create table TestAdd2 (id int)
go

您无法创建此过程

create proc prTest as

insert TestAdd2 values (1)

exec ('ALTER TABLE TestAdd2 add SF_Port_NUM int')

update TestAdd2 set id = 1,SF_Port_NUM = 2

select * from TestAdd2

GO

您收到此错误 Msg 207, Level 16, State 1, Procedure prTest, Line 7 Invalid column name 'SF_Port_NUM'.

这是因为在分析时该列不存在

但是,如果您使用动态SQL进行更新,则可以使用

create proc prTest2 as

insert TestAdd2 values (1)

exec ('ALTER TABLE TestAdd2 add SF_Port_NUM int')

exec ('update TestAdd2 set id = 1,SF_Port_NUM = 2')

select * from TestAdd2

GO

在您的情况下,您的更新声明将是

exec('Update dbo.SYSTM_FRM
SET     dbo.SYSTM_FRM.SF_Ip_TXT = dbo.FRM.FRM_Ip_TXT,
        dbo.SYSTM_FRM.SF_Port_NUM = dbo.FRM.FRM_Port_NUM
FROM dbo.FRM INNER JOIN dbo.SYSTM_FRM 
ON dbo.FRM.FRM_RCRD_NUM = dbo.SYSTM_FRM.SF_FrameRecord_NUM')

答案 2 :(得分:0)

所有DDL语句都应遵循语句分隔符GO以便使用它