TSQL如何在用户定义的函数中输出PRINT?


71

基本上,我想PRINT在用户定义的函数中使用语句来辅助调试。

但是我收到以下错误;

在函数中的“ PRINT”中无效地使用了副作用或时间相关的运算符。

不能这样做吗?

无论如何帮助我的用户定义函数调试?


3
有关执行此操作的实际方法,请参阅:stackoverflow.com/a/10721985/65223
KM。

2
无论您要测试什么值,只需声明一个变量,以后将其删除并将其作为数据集的一部分返回即可。另一个选择
Alexey Shevelyov,

Answers:


37

不,对不起 由于需要确定性,因此SQL Server中的用户定义功能确实受到限制。据我所知,这不可能。

您是否尝试过使用Visual Studio调试SQL代码?


52

提示:产生错误。

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

您将收到以下消息:

将varchar值“要跟踪的值”转换为数据类型int时,转换失败。


1
如果要跟踪的值是整数怎么办?
Roel

1
真的很好 Roel跟踪一个int值,您可以尝试选择@day ='int value#'+ convert(varchar(10),@int_value_to_trace)
dhiman

28

我通过暂时将函数重写为以下方式来解决此问题:

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)

1
我喜欢这种方法,非常有创意。只需将调试输出作为返回表中的另一列返回即可:-)。
Mister_Tom,

26

过去,我倾向于分两个阶段来完成我的功能。第一步是将它们视为相当普通的SQL查询,并确保从中获得正确的结果。在确定它的性能符合预期后,然后将其转换为UDF。


9

使用扩展过程xp_cmdshell运行shell命令。我用它来将输出打印到文件中:

exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'

如果文件debuginfo.txt不存在,则会创建该文件。然后,它将文本“ mytextoutput”(不带引号)添加到文件中。对该函数的任何调用都将写出另一行。

您可能需要首先启用此db-server属性(默认=禁用),但我意识到这可能不适合生产环境中的dba。


2
不要忘了事先运行:EXEC sp_configure'xp_cmdshell”,1 GO RECONFIGURE GO

不要忘记事先运行:EXEC sp_configure'显示高级选项',1 GO RECONFIGURE GO
Irawan Soetomo

要打印日期时间和对该文件的注释,您可以执行以下操作:EXEC xp_cmdshell'echo%DATE%_%TIME%处理内容>> d:\ Log \ debuginfo.log'这将在文件中创建一个输出,该输出看起来像:周四2月21日/ 2019_18:53:10.18处理的东西
贾纳Sattainathan

4

你不能。

您可以function从调用stored procedure并调试stored procedure(这将进入function


或使其成为存储过程
access_granted

0

您可以尝试返回要检查的变量。例如,我有此功能:

--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)

瞧!现在可以了:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.