更改列后数据类型更改为位

时间:2018-06-13 11:37:03

标签: sql sql-server-2008 stored-procedures type-conversion alter

我对此查询进行了编码,但遗憾的是,我收到了此错误:

  

“参数数据类型位对于子字符串的参数1无效   功能“。

我的存储过程是:

ALTER TABLE A ALTER COLUMN B nvarchar(20);  
UPDATE A SET B = CASE WHEN SUBSTRING(B, 1, 2)>1000 
        THEN '1' + B ELSE B END

我转换了我的数据,但又一次出错了。

如果没有第一个(更改表格更改列),我的更新查询绝对是有效的。

任何人都可以解释为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:0)

此代码有效:

create table a (b bit);

alter table a alter column b nvarchar(20);
go

update a
    set b = substring(b, 1, 2);

此代码不会:

create procedure p as
begin
    alter table a alter column b nvarchar(20);

    update a
        set b = substring(b, 1, 2);
end;

为什么不呢?第一个代码实际上更改了表,因此update在运行时是正确的。在存储过程中,两个语句被编译 - 但不运行。这意味着编译了update,但表没有改变。因此,您会收到错误。

虽然您可以使用动态SQL解决此问题,但我会问您为什么要修改存储过程中的列类型。这似乎很不规律。通常,存储过程不会进行此类修改。

答案 1 :(得分:0)

ALTER table Table_1 
ALTER COLUMN Id NVARCHAR(20)

//然后继续......