Sql server 2008 SQL函数-日志记录

Sql server 2008 SQL函数-日志记录,sql-server-2008,debugging,function,Sql Server 2008,Debugging,Function,可能重复: 这让我快发疯了 我有一个我正试图调试的函数,但我不能插入到表中,执行print语句,甚至不能从中引发错误 SQL返回消息 在函数中使用副作用运算符“PRINT”无效 如何调试它,我只想知道变量运行时的值?如果函数返回字符串,您可以插入一个返回,例如 ALTER FUNCTION dbo.whatever() RETURNS NVARCHAR(128) AS BEGIN DECLARE @foo VARCHAR(128); SELECT TOP (1) @foo = nam

可能重复:

这让我快发疯了

我有一个我正试图调试的函数,但我不能插入到表中,执行print语句,甚至不能从中引发错误

SQL返回消息

在函数中使用副作用运算符“PRINT”无效


如何调试它,我只想知道变量运行时的值?

如果函数返回字符串,您可以插入一个返回,例如

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()或CONVERT()将其安全地转换为字符串

您可以使用表值函数执行类似的操作,只需添加一列,在其中可以放置任何要输出的调试消息或变量。

尝试:

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

@ExecuteString = 'echo  '+@Yourtext+' > yourfile.txt)

exec master..xp_cmdshell @ExecuteString, no_output

使用“>”创建/覆盖文件,使用“>>”创建/附加到文件。您可能需要使用
REPLACE(@Yourtext,&','^&')
来转义
&
char

函数到底在做什么?也许你应该改为使用存储过程。正如错误消息所述,您无法执行您试图执行的操作…(令人惊讶的是)
xp\u cmdshell
可以从函数中调用,作为临时调试措施。请尝试执行选择而不是打印。它是一个表值函数,用于存储procedures@RajivVarma,不能从函数中进行选择,因为它是表值函数。@Chad OK。。。因此,在TVF中添加一列,并在返回前插入/更新调试值。@Chad那么,如果您不能使用它,它是一个怎样的解决方案???@Chad但在运行它之前,您不会知道您将它留在那里了。很多读者不是他们自己的QA/部署/测试商店,他们有不同的人,戴着不同的帽子。因此,将xp_cmdshell调用放入函数中的人不一定要记住在部署之前将其取出。PS我不是想说服你,我知道你已经决定做错事了。我提出反对意见是为了让未来的读者有机会做正确的事情,而那些忘记拨打xp_cmdshell的人也会忘记拿出他们的表更改。不管怎样,他们都是草率的。我这样做并不是为了持续几天的更改,这是一个1分钟的put in语句,see value,remove语句。尽管我们在这里禁用了
xp\u cmdshell
,但这通常是一个很好的解决方案@Chad,因为您有一个表值函数,所以我只需构建一个调试文本字符串,并将其作为该表中的一列返回,您可以在调用代码中转储/显示它。