当SQL Server udf函数返回某个结果时创建错误记录

时间:2014-09-14 14:56:36

标签: sql-server tsql stored-procedures user-defined-functions

整个周末,我一直在破坏我的大脑。

我有一个SQL Server UDF来检查作为参数传递的值是否会被截断。

CREATE FUNCTION willTruncate 
      (@fldValue nvarchar(200), 
       @fldSize smallint, 
       @fieldname nvarchar(40), 
       @tbl varchar(15))
RETURNS varchar(200) 
AS 
BEGIN 
    declare @Return varchar(200) 

    declare @fldLen smallint
    SET @fldLen = len(@fldValue)

    if @fldLen <= @fldSize
        SET @Return = @fldValue 
    else 
        SET @Return = left(@fldValue,@fldSize-3) + '...'

    RETURN @Return
END

当我在SQL查询中使用它时,该函数可以正常地截断数据,如下例所示:

select top 10 
    'test' as db,
    fname,
    dbo.willTruncate(lname, 5, 'Last Name', 'People') as lastname,
    dbo.willTruncate(address,40,'Address Line 1', 'People') as addressLine1
from 
    people

我的问题是我需要以某种方式报告截断,以便最终用户可以更正记录。

我有一个表来填充并尝试插入记录作为else子句的一部分,一个单独的函数和一个存储过程。每次运行代码都会失败。

insert into tblTruncationErrors(trunkTable, trunkField, trunkValue) 
values(@tbl, @fieldname, @fldValue)

CREATE FUNCTION dbo.logTruncation 
    (@fldValue nvarchar(200), @fieldname nvarchar(40), @tbl varchar(15))
RETURNS varchar(30) 
AS 
BEGIN 
    declare @Return int

    insert into dbo.truncationErrors(trunkTable, trunkField, trunkValue)
    Values (@tbl, @fieldname, @fldValue)

    SET @Return = @fieldname

    RETURN @Return
END

CREATE PROC sp_logTruncation
    @tbl varchar(20),
    @fldName varchar(30),
    @fldValue varchar(200)
AS
    SET NOCOUNT ON

    insert into dbo.truncationErrors(trunkTable, trunkField, trunkValue)
    Values (@tbl, @fldName, @fldValue)

    SET NOCOUNT OFF
    RETURN 1
GO

将其作为原始功能代码的一部分运行失败,说它需要在函数或存储过程中完成。如果我作为一个函数执行它,它说我必须使用存储过程。将它用作存储过程会产生一条消息,指出它只能从函数运行。

所以,我写错了吗?有没有办法做到这一点。我不坚持它进入一个表,所以Excel或csv文件输出也很棒。

0 个答案:

没有答案