code

TSQL 사용자 정의 함수에서 PRINT를 어떻게 출력합니까?

codestyles 2020. 11. 27. 08:06
반응형

TSQL 사용자 정의 함수에서 PRINT를 어떻게 출력합니까?


기본적으로 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로 변환 할 때 변환에 실패했습니다.


나는 과거에 두 단계로 내 기능을 수행하는 경향이 있습니다. 첫 번째 단계는 그것들을 상당히 일반적인 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 속성을 먼저 활성화해야 할 수도 있습니다 (기본값 = 비활성화 됨).하지만 프로덕션 환경에서는 dba가 마음에 들지 않을 수도 있습니다.


아니 당신은 할 수 없습니다.

당신은 호출 할 수 있습니다 functionA로부터 stored 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

실행하면 .. 메시지 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'를 얻습니다. 그래서 저는 한 명씩 떨어져서 ..

set @day_part = substring(@date, 0, @point_ix + 1)

짜잔! 이제 작동합니다 :)

참고 URL : https://stackoverflow.com/questions/586642/tsql-how-do-you-output-print-in-a-user-defined-function

반응형