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가 마음에 들지 않을 수도 있습니다.
아니 당신은 할 수 없습니다.
당신은 호출 할 수 있습니다 function
A로부터 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
'code' 카테고리의 다른 글
onClick에 반응하고 preventDefault () 링크 새로 고침 / 리디렉션? (0) | 2020.11.27 |
---|---|
차이 fn (문자열… 인수) 대 fn (문자열 [] 인수) (0) | 2020.11.27 |
팝업 메시지 상자 (0) | 2020.11.26 |
thead와 tbody 사이의 간격 (0) | 2020.11.26 |
번들의 내용을 Logcat에 인쇄 하시겠습니까? (0) | 2020.11.26 |