整个周末,我一直在破坏我的大脑。
我有一个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文件输出也很棒。