PRINT
基本的に、デバッグを支援するためにユーザー定義関数内でステートメントを使用したいと考えています。
ただし、次のエラーが発生します。
関数内の 'PRINT' での副作用または時間依存の演算子の使用は無効です。
これはできませんか?
とにかく、ユーザー定義関数のデバッグを支援するには?
PRINT
基本的に、デバッグを支援するためにユーザー定義関数内でステートメントを使用したいと考えています。
ただし、次のエラーが発生します。
関数内の 'PRINT' での副作用または時間依存の演算子の使用は無効です。
これはできませんか?
とにかく、ユーザー定義関数のデバッグを支援するには?
ヒント:エラーを生成します。
declare @Day int, @Config_Node varchar(50)
set @Config_Node = 'value to trace'
set @Day = @Config_Node
次のメッセージが表示されます。
varchar値'valuetotrace'をデータ型intに変換するときに変換に失敗しました。
関数を一時的に次のように書き直すことで、これを回避しました。
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)
私はこれまで、自分の職務を 2 段階で行う傾向がありました。最初の段階では、それらをかなり通常の SQL クエリとして扱い、正しい結果が得られるようにします。期待どおりに機能していることを確認したら、それを UDF に変換します。
シェル コマンドを実行するには、拡張プロシージャ xp_cmdshell を使用します。出力をファイルに出力するために使用しました。
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
debuginfo.txt ファイルが存在しない場合は作成されます。次に、テキスト "mytextoutput" (引用符なし) をファイルに追加します。関数を呼び出すと、追加の行が書き込まれます。
最初にこの db-server プロパティを有効にする必要があるかもしれません (デフォルト = 無効)。
いいえ、あなたがすることはできません。
function
aから aを呼び出してastored procedure
をデバッグできます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
実行すると..次のメッセージが表示されます: Msg 241, Level 16, State 1, Line 1 Conversion failed when conversion date and/or time from character string.
ああああ!!
それで、私は何をしますか?
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)
出来上がり!今では動作します:)