基本上我想在用戶定義的函數中使用PRINT
語句來輔助我的調試。TSQL如何在用戶定義函數中輸出PRINT?
但是,我收到以下錯誤;
函數中'PRINT' 中的副作用或時間相關運算符的使用無效。
難道這不行嗎?
無論如何,以幫助我的用戶定義函數調試?
基本上我想在用戶定義的函數中使用PRINT
語句來輔助我的調試。TSQL如何在用戶定義函數中輸出PRINT?
但是,我收到以下錯誤;
函數中'PRINT' 中的副作用或時間相關運算符的使用無效。
難道這不行嗎?
無論如何,以幫助我的用戶定義函數調試?
不,對不起。 SQL Server中用戶定義的函數實際上是有限的,因爲它們是確定性的。就我所知,沒有辦法。
您是否嘗試過使用Visual Studio調試SQL代碼?
不,你不能。
你可以調用從stored procedure
一個function
和調試stored procedure
(這將步入function
)
或使其存儲過程 – 2018-03-02 03:14:22
我往往在過去的兩個階段對我的工作的功能。第一階段將把它們視爲相當普通的SQL查詢,並確保我從中得到正確的結果。在我確信它正在按照需要執行之後,我會將其轉換爲UDF。
這是怎麼做到這一點:) – Shiva 2014-02-12 18:22:11
我解決此得到了暫時改寫我的功能是這樣的:
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)
我喜歡這種方法,很創意。只需返回調試輸出作爲返回表中的另一列:-)。 – 2011-11-07 21:25:24
你可以嘗試返回要檢查的變量。 例如我有這樣的功能:
--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)
瞧!現在它工作:)
提示: 產生錯誤。
declare @Day int, @Config_Node varchar(50)
set @Config_Node = 'value to trace'
set @Day = @Config_Node
你會得到這個消息:
轉換失敗轉換爲varchar值時,「價值跟蹤」 爲int數據類型。
非常簡單的黑客工作很好。我書中的最佳答案! – 2015-07-07 19:24:10
使用擴展過程xp_cmdshell來運行shell命令。我用它打印輸出到一個文件:
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
這將創建文件debuginfo.txt,如果它不存在。然後它將文本「mytextoutput」(不帶引號)添加到文件中。任何對函數的調用都會寫入一行。
您可能需要首先啓用此db-server屬性(默認=禁用),但我認識到可能不是喜歡dba的生產環境。
不要忘了事先運行:EXEC sp_configure'xp_cmdshell」,1 GO RECONFIGURE GO – Jan 2017-04-19 07:33:22
一個實際的方式來做到這一點,請參閱:http://stackoverflow.com/a/10721985/65223 – 2012-05-23 14:36:04