2012-05-23 60 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