Sql 数据类型更改为alter列后的位

Sql 数据类型更改为alter列后的位,sql,sql-server-2008,stored-procedures,type-conversion,alter,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 我转换了数据,但再次出现错误 如果没有第一个(Alter Table Alter Column),则我的更新查

我编写了此查询的代码,但不幸的是,我遇到了以下错误:

“参数数据类型位对于子字符串的参数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
我转换了数据,但再次出现错误

如果没有第一个(Alter Table Alter Column),则我的更新查询绝对有效

有人能解释为什么会发生这种情况,我应该如何解决它吗

此代码适用于:

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
在运行时是正确的。在存储过程中,这两条语句是编译的,但不是运行的。这意味着编译了
更新
,但表没有更改。因此你会得到一个错误

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

ALTER table Table_1 
ALTER COLUMN Id NVARCHAR(20)

//然后继续…

用您正在使用的数据库标记您的问题。我使用sql\u server 2008:)