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

c00*_*0ke 65 t-sql user-defined-functions

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

但是我收到以下错误;

在函数的"PRINT"中无效使用副作用或时间相关的运算符.

这可不可以吗?

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

Est*_*vez 42

提示:生成错误.

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node
Run Code Online (Sandbox Code Playgroud)

你会收到这条消息:

将varchar值'value to trace'转换为数据类型int时转换失败.

  • 明智的笑声。当你不给我们一个方便的“正确”方式时,我们就会发明一个方便的“错误”方式。 (2认同)

Tor*_*gen 34

不,对不起 SQL Server中的用户定义函数非常有限,因为要求它们是确定性的.据我所知,没办法绕过它.

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


The*_*TXI 25

我过去倾向于分两个阶段来完成我的职能.第一个阶段是将它们视为相当普通的SQL查询,并确保我从中获得正确的结果.在我确信它正在按预期执行之后,我会将其转换为UDF.


小智 21

我通过暂时将我的函数重写为以下内容来解决这个问题:

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)
Run Code Online (Sandbox Code Playgroud)


小智 7

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

exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
Run Code Online (Sandbox Code Playgroud)

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

您可能需要首先启用此db-server属性(默认=禁用),但我认为这可能不符合dba对生产环境的喜好.

  • 不要忘记事先运行:EXEC sp_configure'xp_cmdshell',1 GO RECONFIGURE GO (2认同)