2012-05-23 61 views
2

可能重复:
TSQL How do you output PRINT in a user defined function?SQL功能 - 记录

这是推动我疯了。

我有我试图调试功能,但我不能插入表中,执行打印语句,甚至是从它产生一个错误。

SQL返回消息

无效使用的函数中的副作用的操作“打印”的。

我该如何调试这个,我只想知道变量在运行时的值?

+0

究竟是什么是你的函数做什么?也许你应该使用存储过程。正如错误消息所述,你不能做你想做的事...... –

+3

(令人惊讶的是)''xp_cmdshell''可以从函数调用,所以[可能帮助](http://sqlblog.com/blogs/ denis_gobo/archive/2008/05/08/6703.aspx)作为临时调试措施。 –

+2

尝试做一个选择而不是打印。 – rvphx

回答

4

尝试:

DECLARE @ExecuteString varchar(500) 
     ,@Yourtext  varchar(500) 

@ExecuteString = 'echo '[email protected]+' > yourfile.txt) 

exec master..xp_cmdshell @ExecuteString, no_output 

使用 “>” 创建/覆盖文件和 “>>” 创建/追加到文件中。您可能需要使用REPLACE(@Yourtext,'&','^&')逃脱&焦炭

+0

尽管我们在这里禁用了'xp_cmdshell',这通常是一个很好的解决方案! – CaffGeek

+2

@Chad,因为你有一个表值函数,我只是建立一个调试文本字符串,并将其作为列中的字段返回,您可以在调用代码中进行转储/显示。 –

2

如果你的函数返回一个字符串,你总是可以插回例如

ALTER FUNCTION dbo.whatever() 
RETURNS NVARCHAR(128) 
AS 
BEGIN 
    DECLARE @foo VARCHAR(128); 

    SELECT TOP (1) @foo = name FROM sys.objects ORDER BY NEWID(); 

    -- temporary debug: 
    RETURN (@foo); 

    ... continue with function 
END 
GO 

如果变量是数字或日期,你可以使用RTRIM()或()转换到安全首先转换为字符串。

你可以做一个表值函数类似的东西,只是添加一列,你可以把你想输出任何调试消息或变量。

+0

这是一个表值函数。 – CaffGeek

+1

@Chad OK ...因此添加一列到TVF并在返回之前在其中插入/更新调试值。 –

+0

@KM。,为什么?我不会永远离开'xp_cmdshell',它很快并且很容易被删除。添加一列到返回表,并填充它是很多工作,特别是如果我想要几个值,并且该表有许多不可为空的字段.. – CaffGeek