我创建了一个名为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
通过错误
无效的列名。
如何纠正此错误?
答案 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
注意:如果需要多次调用,请检查该列是否存在