基本的に、デバッグを支援するために、ユーザー定義関数内でPRINT
ステートメントを使用します。
ただし、次のエラーが表示されます。
関数内の 'PRINT'での副作用演算子または時間依存演算子の無効な使用。
これはできませんか?
とにかく、ユーザー定義関数のデバッグを支援するには?
いいえ、ごめんなさい。 SQL Serverのユーザー定義関数は、確定的である必要があるため、実際には制限されています。私の知る限り、それを回る方法はありません。
Visual StudioでSQLコードをデバッグしようとしましたか?
ヒント:エラーを生成します。
declare @Day int, @Config_Node varchar(50)
set @Config_Node = 'value to trace'
set @Day = @Config_Node
次のメッセージが表示されます。
varchar値 'value to trace'をデータ型intに変換するときに変換に失敗しました
私は過去に2つの段階で自分の機能に取り組む傾向がありました。最初の段階では、それらをかなり通常のSQLクエリとして扱い、正しい結果が得られるようにします。期待どおりに動作することを確信したら、UDFに変換します。
これを回避するには、関数を一時的に次のように書き換えます。
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)
拡張プロシージャxp_cmdshellを使用して、シェルコマンドを実行します。出力をファイルに出力するために使用しました:
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
これにより、ファイルdebuginfo.txtが存在しない場合に作成されます。次に、テキスト「mytextoutput」(引用符なし)をファイルに追加します。関数を呼び出すと、追加の行が書き込まれます。
最初にこのdb-serverプロパティを有効にする必要があるかもしれません(デフォルト=無効).
いいえ、あなたがすることはできません。
stored procedure
からfunction
を呼び出し、stored procedure
をデバッグできます(これはfunction
にステップインします)
検査したい変数を返してみることができます。例えば。私はこの機能を持っています:
--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、行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」を取得します。だから、私は1つ離れているので、私は...に変わります.
set @day_part = substring(@date, 0, @point_ix + 1)
出来上がり!今では動作します:)