我有一个标量函数,用于将文本格式化为大写并删除前导,尾随空格等。在存储过程中的插入操作期间,我正在调用这样的函数:
insert into tablename(col1,col2) values ( dbo.function_name(value1),value2)
这里col1不是NULL。上面的语句抛出错误“尝试将非NULL-able列的值设置为NULL”。但是,如果单独运行该函数,则会正确返回该值。
请帮助解释我哪里出错。
答案 0 :(得分:1)
insert into table(Col1,Col2)
values (isnull(dbo.function_name(value1),''),value2)
答案 1 :(得分:0)
如何尝试先将值放在变量中,并在调试时提供帮助。
DECLARE @val1 varchar(100)
SET @val1 = dbo.function_name(value1)
PRINT @val1 -- print it to see if we get what we expect.
SET @val1 = isnull(@val1,'') -- We can also check for null
insert into tablename(col1,col2) values ( @val1,value2)
这至少会确认执行过程中发生的事情,您可以确认该功能正在按预期运行。
答案 2 :(得分:0)
您是否可以添加一个简短但完整的示例,该示例实际上会向您的问题演示问题。以下不会产生任何错误,但我必须在很多地方猜测:
create table tablename (
col1 varchar(20) not null,
col2 varchar(10) null
)
go
create function dbo.function_name (
@InVal varchar(20)
)
returns varchar(20)
as
begin
return UPPER(LTRIM(RTRIM(@InVal)))
end
go
create procedure dbo.procname
@value1 varchar(20),
@value2 varchar(10)
as
insert into tablename(col1,col2) values ( dbo.function_name(@value1),@value2)
go
exec dbo.procname ' abc ','def'
go
select * from tablename
结果:
col1 col2
ABC def