存储过程中的sql函数

时间:2011-03-08 14:33:07

标签: sql sql-server

我有一个标量函数,用于将文本格式化为大写并删除前导,尾随空格等。在存储过程中的插入操作期间,我正在调用这样的函数:

insert into tablename(col1,col2) values ( dbo.function_name(value1),value2)

这里col1不是NULL。上面的语句抛出错误“尝试将非NULL-able列的值设置为NULL”。但是,如果单独运行该函数,则会正确返回该值。

请帮助解释我哪里出错。

3 个答案:

答案 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