用于向表添加列的Sql Server存储过程

时间:2017-04-06 12:44:23

标签: sql sql-server stored-procedures

我正在尝试创建一个存储过程,它会在表的末尾添加两列。 SP需要3个输入,表名,状态和学年。

当我运行SP时,我收到错误:

The name "CA" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

这是我的SP:

CREATE PROCEDURE sp_addScoolEnrollYear 
    @state nvarchar(2),   
    @shcoolYear nvarchar(15),
    @tableName nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Sql NVARCHAR(MAX);

SET @Sql=   N'alter table ' + quotename(@tableName) + 
               N'add StateEnrollID varchar(2) default ' + quotename(@state) + N'not null,
                     SchoolYearKey varchar(20) default ' + quotename(@shcoolYear) + N'not null'

    EXECUTE sp_executesql @Sql
END
GO

这就是我执行的方式:

[dbo].[sp_addScoolEnrollYear] N'CA', N'2014-2015' , N'[dbo].[test_copy]'

1 个答案:

答案 0 :(得分:1)

您在表名周围添加了额外的方括号,您需要在字符串周围使用'而不是方括号,并且在单词之间使用更多空格,并且每个添加的列都需要是单独的alter:

CREATE PROCEDURE sp_addScoolEnrollYear 
    @state nvarchar(2),   
    @shcoolYear nvarchar(15),
    @tableName sysname
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Sql NVARCHAR(MAX);

SET @Sql=N'alter table ' + @tablename 
       + N' add StateEnrollID varchar(2) default ''' + @state + N''' not null;' +char(10)
       + N'alter table ' + @tablename 
       + N' add SchoolYearKey varchar(20) default ''' + @shcoolYear + N''' not null;'
    select  @sql;
    EXECUTE sp_executesql @Sql;
END

END
GO
exec [dbo].[sp_addScoolEnrollYear] N'CA', N'2014-2015' , N'[dbo].[test_copy]'

代码生成:

alter table dbo.test_copy add StateEnrollID varchar(2) default 'CA' not null;
alter table dbo.test_copy add SchoolYearKey varchar(20) default '2014-2015' not null;

rextester演示:http://rextester.com/HEKC53724