76

PRINT基本的に、デバッグを支援するためにユーザー定義関数内でステートメントを使用したいと考えています。

ただし、次のエラーが発生します。

関数内の 'PRINT' での副作用または時間依存の演算子の使用は無効です。

これはできませんか?

とにかく、ユーザー定義関数のデバッグを支援するには?

4

8 に答える 8

55

ヒント:エラーを生成します。

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

次のメッセージが表示されます。

varchar値'valuetotrace'をデータ型intに変換するときに変換に失敗しました。

于 2013-02-07T14:06:44.907 に答える
31

関数を一時的に次のように書き直すことで、これを回避しました。

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)
于 2009-10-03T19:42:11.470 に答える
27

私はこれまで、自分の職務を 2 段階で行う傾向がありました。最初の段階では、それらをかなり通常の SQL クエリとして扱い、正しい結果が得られるようにします。期待どおりに機能していることを確認したら、それを UDF に変換します。

于 2009-02-25T16:09:50.510 に答える
12

シェル コマンドを実行するには、拡張プロシージャ xp_cmdshell を使用します。出力をファイルに出力するために使用しました。

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

debuginfo.txt ファイルが存在しない場合は作成されます。次に、テキスト "mytextoutput" (引用符なし) をファイルに追加します。関数を呼び出すと、追加の行が書き込まれます。

最初にこの db-server プロパティを有効にする必要があるかもしれません (デフォルト = 無効)。

于 2014-10-07T14:38:18.117 に答える
4

いいえ、あなたがすることはできません。

functionaから aを呼び出してastored procedureをデバッグできますstored procedure(これにより にステップ インしますfunction) 。

于 2009-02-25T16:08:08.783 に答える
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

実行すると..次のメッセージが表示されます: 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)

出来上がり!今では動作します:)

于 2012-11-09T11:23:47.170 に答える