2009-02-25 58 views
46

基本上我想在用戶定義的函數中使用PRINT語句來輔助我的調試。TSQL如何在用戶定義函數中輸出PRINT?

但是,我收到以下錯誤;

函數中'PRINT' 中的副作用或時間相關運算符的使用無效。

難道這不行嗎?

無論如何,以幫助我的用戶定義函數調試?

+2

一個實際的方式來做到這一點,請參閱:http://stackoverflow.com/a/10721985/65223 – 2012-05-23 14:36:04

回答

27

不,對不起。 SQL Server中用戶定義的函數實際上是有限的,因爲它們是確定性的。就我所知,沒有辦法。

您是否嘗試過使用Visual Studio調試SQL代碼?

4

不,你不能。

你可以調用從stored procedure一個function和調試stored procedure(這將步入function

+0

或使其存儲過程 – 2018-03-02 03:14:22

20

我往往在過去的兩個階段對我的工作的功能。第一階段將把它們視爲相當普通的SQL查詢,並確保我從中得到正確的結果。在我確信它正在按照需要執行之後,我會將其轉換爲UDF。

+0

這是怎麼做到這一點:) – Shiva 2014-02-12 18:22:11

20

我解決此得到了暫時改寫我的功能是這樣的:

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

我喜歡這種方法,很創意。只需返回調試輸出作爲返回表中的另一列:-)。 – 2011-11-07 21:25:24

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,行 轉換從字符串轉換日期和/或時間時失敗。

唉!

那麼,我該怎麼辦?

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) 

瞧!現在它工作:)

29

提示: 產生錯誤。

declare @Day int, @Config_Node varchar(50) 

    set @Config_Node = 'value to trace' 

    set @Day = @Config_Node 

你會得到這個消息:

轉換失敗轉換爲varchar值時,「價值跟蹤」 爲int數據類型。

+3

非常簡單的黑客工作很好。我書中的最佳答案! – 2015-07-07 19:24:10

5

使用擴展過程xp_cmdshell來運行shell命令。我用它打印輸出到一個文件:

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

這將創建文件debuginfo.txt,如果它不存在。然後它將文本「mytextoutput」(不帶引號)添加到文件中。任何對函數的調用都會寫入一行。

您可能需要首先啓用此db-server屬性(默認=禁用),但我認識到可能不是喜歡dba的生產環境。

+1

不要忘了事先運行:EXEC sp_configure'xp_cmdshell」,1 GO RECONFIGURE GO – Jan 2017-04-19 07:33:22

相關問題