【问题标题】:Add new columns to a SQL Server table within a while loop在 while 循环内向 SQL Server 表添加新列
【发布时间】:2016-08-17 17:26:37
【问题描述】:
declare @a int, @min date, @max date,@i int = 0, @columnname nvarchar(max),@b nvarchar(7) = 'aa'
select @min = min([Starting Date]) from [Quantities&Planning]
select @max = max([Finish Date]) from [Quantities&Planning]
set @a  = DATEDIFF(DAY,@min,@max)
while @i < @a
begin
set @i = @i +1
set @b = str(@i)
set @columnname = 'alter table Test1 add ' + @b + ' decimal(18,2) NULL'
PRINT @columnname
exec (@columnname)
end

我的代码没有按预期工作。基本上我想创建命名为数字的新列,如 1,2,3,4,5... 这是错误代码:

警告:空值被聚合或其他 SET 操作消除。 警告:空值被聚合或其他 SET 操作消除。

消息 2812,第 16 级,状态 62,第 11 行
找不到存储过程'alter table Test1 add decimal(18,2) NULL'。

消息 2812,第 16 级,状态 62,第 11 行
找不到存储过程'alter table Test1 add decimal(18,2) NULL'。

消息 2812,第 16 级,状态 62,第 11 行
找不到存储过程'alter table Test1 add decimal(18,2) NULL'。

【问题讨论】:

    标签: sql-server stored-procedures while-loop alter


    【解决方案1】:

    您需要在variable 旁边的EXEC 旁边加上括号

    ...........
    exec (@columnname)
    ...........
    

    您也可以SP_EXECUTESQL 执行框架式 DDL 查询,该查询不需要括号,但变量应为 NVARCHAR 类型

    ...........
    EXEC SP_EXECUTESQL @columnname
    ...........
    

    要调试查询,您可以在执行前使用PRINT 语句

    ...........
    PRINT @columnname
    exec (@columnname)
    ...........
    

    【讨论】:

    • 现在它抛出这个异常:Msg 173, Level 15, State 1, Line 1 列“十进制”的定义必须包含数据类型。
    • @Macukadam 变量 @bempty 这就是您收到此错误的原因。确保@b 变量中有一些名称。使用 print 调试查询
    • alter table Test1 add decimal(18,2) NULL Msg 173, Level 15, State 1, Line 1 列“十进制”的定义必须包含数据类型。 alter table Test1 add decimal(18,2) NULL Msg 173, Level 15, State 1, Line 1 列“十进制”的定义必须包含数据类型。
    • @Macukadam - 老兄,@b 变量为空 当您想向表中添加新列时,您需要为其命名
    • alter table Test1 add decimal(18,2) NULL 打印给出了这样的结果。顺便说一句,add 和 decimal(18,2) 之间有很大的空间,这是 c 的额外问题 :) 谢谢
    猜你喜欢
    • 2014-11-14
    • 2016-01-02
    • 2020-03-01
    • 2018-10-28
    • 2020-05-19
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多