2009-02-25 33 views
46

Về cơ bản tôi muốn sử dụng câu lệnh PRINT bên trong một hàm do người dùng xác định để hỗ trợ gỡ lỗi của tôi.TSQL Làm thế nào để bạn xuất ra PRINT trong một hàm do người dùng định nghĩa?

Tuy nhiên tôi nhận được lỗi sau;

Sử dụng tác nhân phụ hoặc phụ thuộc thời gian không hợp lệ trong 'PRINT' trong một hàm.

Điều này có thể thực hiện được không?

Dù sao để hỗ trợ gỡ lỗi chức năng do người dùng xác định?

+2

để biết cách thực tế để thực hiện việc này, hãy xem: http://stackoverflow.com/a/10721985/65223 –

Trả lời

27

Không, xin lỗi. Các hàm do người dùng định nghĩa trong SQL Server thực sự bị hạn chế, vì yêu cầu chúng là xác định. Không có cách nào làm tròn nó, theo như tôi biết.

Bạn đã thử gỡ lỗi mã SQL bằng Visual Studio chưa?

4

Không, bạn không thể.

Bạn có thể gọi một function từ một stored procedure và gỡ lỗi một stored procedure (điều này sẽ bước vào function)

+0

hoặc thực hiện thủ tục được lưu trữ –

20

Tôi có xu hướng trong quá khứ để làm việc trên chức năng của tôi trong hai giai đoạn. Giai đoạn đầu tiên sẽ là đối xử với chúng như các truy vấn SQL khá bình thường và đảm bảo rằng tôi nhận được kết quả đúng đắn từ nó. Sau khi tôi tự tin rằng nó đang hoạt động như mong muốn, sau đó tôi sẽ chuyển đổi nó thành một UDF.

+0

Đây là cách tôi cũng làm như vậy :) – Shiva

20

tôi xung quanh này bằng cách tạm thời viết lại chức năng của tôi để một cái gì đó như thế này:

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

Tôi thích phương pháp này, rất sáng tạo. Chỉ cần trả về đầu ra gỡ lỗi như một cột khác trong bảng trả về :-). –

0

Bạn có thể thử gửi lại biến bạn muốn kiểm tra. Ví dụ: Tôi có chức năng này:

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

Khi tôi chạy nó .. Tôi nhận được: Msg 241, Level 16, State 1, Line 1 chuyển đổi thất bại khi chuyển đổi ngày tháng và/hoặc thời gian từ chuỗi ký tự.

Arghh !!

Vì vậy, tôi phải làm gì?

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 

Và tôi nhận được '25'. Vì vậy, tôi tắt bởi một và vì vậy tôi thay đổi thành ..

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

Thì đấy! Bây giờ nó hoạt động :)

29

Mẹo: tạo ra lỗi.

declare @Day int, @Config_Node varchar(50) 

    set @Config_Node = 'value to trace' 

    set @Day = @Config_Node 

Bạn sẽ nhận được tin nhắn này:

chuyển đổi thất bại khi chuyển đổi giá trị varchar 'giá trị để theo dõi' đến kiểu dữ liệu int.

+3

Rất đơn giản, hack hoạt động tốt. Câu trả lời hay nhất trong cuốn sách của tôi! –

5

Sử dụng thủ tục mở rộng xp_cmdshell để chạy lệnh trình bao. Tôi đã sử dụng nó để in đầu ra thành một tệp:

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

Điều này tạo ra tệp debuginfo.txt nếu nó không tồn tại. Sau đó, nó thêm văn bản "mytextoutput" (không có dấu ngoặc kép) vào tệp. Bất kỳ cuộc gọi nào đến hàm sẽ viết một dòng bổ sung.

Bạn có thể cần kích hoạt thuộc tính máy chủ db này trước (mặc định = bị vô hiệu), mà tôi nhận ra có thể không theo ý thích của dba đối với môi trường sản xuất.

+1

Đừng quên chạy trước: EXEC sp_configure'xp_cmdshell ', 1 GO RECONFIGURE GO – Jan

+0

Đừng quên chạy trước: EXEC sp_configure' hiển thị tùy chọn nâng cao ', 1 GO RECONFIGURE GO –

Các vấn đề liên quan