web-dev-qa-db-ja.com

TSQLユーザー定義関数でどのようにPRINTを出力しますか?

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

ただし、次のエラーが表示されます。

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

これはできませんか?

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

61
c00ke

いいえ、ごめんなさい。 SQL Serverのユーザー定義関数は、確定的である必要があるため、実際には制限されています。私の知る限り、それを回る方法はありません。

Visual StudioでSQLコードをデバッグしようとしましたか?

32
Tor Haugen

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

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

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

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

42
Estevez

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

24
TheTXI

これを回避するには、関数を一時的に次のように書き換えます。

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)
21
v1964

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

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

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

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

7
LDerckx

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

stored procedureからfunctionを呼び出し、stored procedureをデバッグできます(これはfunctionにステップインします)

4
Quassnoi

検査したい変数を返してみることができます。例えば。私はこの機能を持っています:

--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)

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

0
h.alex