如何使用过程在SQL Server中添加列并更新列

时间:2018-08-13 09:35:35

标签: sql sql-server sql-server-2008

我创建了一个名为test_exam的表 创建表test_exam(id int,age int) 比我想要的通过过程添加名为name的列并更新其值。

我已经完成了程序

create procedure [dbo].[abcd1] @tablename sysname
as
begin
declare @query nvarchar(4000)
declare @name_test varchar(20)
set @query = N'select top 10 * from transorg_DW.dbo.'+@tablename
print @query
alter table test_exam add name varchar(20);
update test_exam set name='shyam' where id=1;

exec sp_executesql 
end

通过错误

  

无效的列名。

如何纠正此错误?

2 个答案:

答案 0 :(得分:0)

将任何列添加到现有表时,请允许为null或提供一些默认值。 并防止DDL命令执行一次以上,否则将在下次执行时引发错误。 并且由于其在创建proc时不存在name列,因此会更新其抛出错误。更新语句必须作为动态查询。

    create procedure [dbo].[abcd1] @tablename sysname
        as
        begin
        declare @query nvarchar(4000)

        declare @name_test varchar(20)  
        set @query = N'select top 10 * from transorg_DW.dbo.'+@tablename
        print @query
        if not exists(select * from sys.columns c join sys.tables t on c.object_id=t.object_id 
                      where t.name='test_exam' and c.name='name')
         begin
             --new column added must be as null value or default value
             alter table test_exam 
             add name varchar(20) null;

         end
       declare @query1 nvarchar(4000)
        set @query1='update test_exam set name=''shyam'' where id=1';
        exec (@query1)
        exec sp_executesql 
        end

希望这会有所帮助。

答案 1 :(得分:0)

您应该动态地单独调用它,我想,它将在编译时用于列,因此它显示错误。现在,您可以执行以下操作

DECLARE @sql NVARCHAR(500)
SET @sql = ' alter table purchase add stat int'
EXEC sp_executesql @sql

SET @sql = ' update purchase set stat=0'
EXEC sp_executesql @sql

注意:如果需要多次调用,请检查该列是否存在