基本上,我想PRINT
在用户定义的函数中使用语句来辅助调试。
但是我收到以下错误;
在函数中的“ PRINT”中无效地使用了副作用或时间相关的运算符。
不能这样做吗?
无论如何帮助我的用户定义函数调试?
基本上,我想PRINT
在用户定义的函数中使用语句来辅助调试。
但是我收到以下错误;
在函数中的“ PRINT”中无效地使用了副作用或时间相关的运算符。
不能这样做吗?
无论如何帮助我的用户定义函数调试?
Answers:
我通过暂时将函数重写为以下方式来解决此问题:
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)
使用扩展过程xp_cmdshell运行shell命令。我用它来将输出打印到文件中:
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
如果文件debuginfo.txt不存在,则会创建该文件。然后,它将文本“ mytextoutput”(不带引号)添加到文件中。对该函数的任何调用都将写出另一行。
您可能需要首先启用此db-server属性(默认=禁用),但我意识到这可能不适合生产环境中的dba。
您可以尝试返回要检查的变量。例如,我有此功能:
--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
当我运行它时。我得到:消息241,级别16,状态1,行1从字符串转换日期和/或时间时转换失败。
啊!
那么,我该怎么办?
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)
瞧!现在可以了:)