基本上,我想在用户定义的函数中使用
然而,我收到以下错误信息:
“在函数中使用具有副作用或时间相关性运算符的'PRINT' 无效。”
这样做不行吗?
有没有方法可以帮助我调试用户定义的函数?
PRINT
语句来帮助我调试。然而,我收到以下错误信息:
“在函数中使用具有副作用或时间相关性运算符的'PRINT' 无效。”
这样做不行吗?
有没有方法可以帮助我调试用户定义的函数?
PRINT
语句来帮助我调试。提示:产生错误。
declare @Day int, @Config_Node varchar(50)
set @Config_Node = 'value to trace'
set @Day = @Config_Node
您将收到此消息:
在将varchar值“value to trace”转换为int数据类型时,转换失败。
抱歉,SQL Server中的用户定义函数非常有限,因为其需要是确定性的。据我所知,没有任何绕过此要求的方法。
您尝试使用Visual Studio调试SQL代码了吗?
IF OBJECT_ID ('[dbo].[fx_dosomething]', 'TF') IS NOT NULL
drop function [dbo].[fx_dosomething];
GO
create FUNCTION dbo.fx_dosomething ( @x numeric )
returns @t table (debug varchar(100), x2 numeric)
as
begin
declare @debug varchar(100)
set @debug = 'printme';
declare @x2 numeric
set @x2 = 0.123456;
insert into @t values (@debug, @x2)
return
end
go
select * from fx_dosomething(0.1)
过去我倾向于分两个阶段处理我的函数。第一阶段是将它们视为相当正常的SQL查询,并确保我得到了正确的结果。在我确认它按预期执行后,我才会将其转换为UDF。
使用扩展存储过程xp_cmdshell运行一个Shell命令。我用它来将输出打印到文件中:
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
如果debuginfo.txt文件不存在,则此操作将创建该文件。然后,它会将文本“mytextoutput”(不带引号)添加到文件中。对该函数的任何调用都将写入一行额外的内容。
您可能需要先启用此db-server属性(默认为禁用),我意识到这可能不符合dba在生产环境中的喜好。
create or alter function func_do_something_with_string(@input nvarchar(max)) returns nvarchar(max)
as begin
-- some function logic content
declare @result nvarchar(max)
set @result = substring(@input , 1, 10)
-- or do something else
return @result
end
然后我只需将其复制并在函数外部运行以进行调试
declare @input nvarchar(max) = 'Some string'
-- some function logic content
declare @result nvarchar(max)
set @result = substring(@input , 1, 10)
-- this line is added to check while debugging
print @result
-- or do something else
-- print the final result
print @result
--Contencates seperate date and time strings and converts to a datetime. Date should be in format 25.03.2012. Time as 9:18:25.
ALTER FUNCTION [dbo].[ufn_GetDateTime] (@date nvarchar(11), @time nvarchar(11))
RETURNS datetime
AS
BEGIN
--select dbo.ufn_GetDateTime('25.03.2012.', '9:18:25')
declare @datetime datetime
declare @day_part nvarchar(3)
declare @month_part nvarchar(3)
declare @year_part nvarchar(5)
declare @point_ix int
set @point_ix = charindex('.', @date)
set @day_part = substring(@date, 0, @point_ix)
set @date = substring(@date, @point_ix, len(@date) - @point_ix)
set @point_ix = charindex('.', @date)
set @month_part = substring(@date, 0, @point_ix)
set @date = substring(@date, @point_ix, len(@date) - @point_ix)
set @point_ix = charindex('.', @date)
set @year_part = substring(@date, 0, @point_ix)
set @datetime = @month_part + @day_part + @year_part + ' ' + @time
return @datetime
END
ALTER FUNCTION [dbo].[ufn_GetDateTime] (@date nvarchar(11), @time nvarchar(11))
RETURNS nvarchar(22)
AS
BEGIN
--select dbo.ufn_GetDateTime('25.03.2012.', '9:18:25')
declare @day_part nvarchar(3)
declare @point_ix int
set @point_ix = charindex('.', @date)
set @day_part = substring(@date, 0, @point_ix)
return @day_part
END
我得到了'25'。所以,我差了一个,于是我进行了更改...
set @day_part = substring(@date, 0, @point_ix + 1)
太好了!现在它可以工作了 :)