我对此查询进行了编码,但遗憾的是,我收到了此错误:
“参数数据类型位对于子字符串的参数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
我转换了我的数据,但又一次出错了。
如果没有第一个(更改表格更改列),我的更新查询绝对是有效的。
任何人都可以解释为什么会发生这种情况,我该如何解决?
答案 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)
//然后继续......