2009-02-25 9 views
46

असल में मैं अपने डीबगिंग के सहयोगी उपयोगकर्ता परिभाषित फ़ंक्शन के अंदर PRINT कथन का उपयोग करना चाहता हूं।टीएसक्यूएल आप उपयोगकर्ता परिभाषित फ़ंक्शन में PRINT कैसे आउटपुट करते हैं?

हालांकि मुझे निम्न त्रुटि मिल रही है;

फ़ंक्शन के भीतर 'प्रिंट' में साइड-इफेक्टिंग या टाइम-निर्भर ऑपरेटर का अमान्य उपयोग।

क्या यह नहीं किया जा सकता है?

वैसे भी मेरे उपयोगकर्ता परिभाषित फ़ंक्शन डीबगिंग की सहायता करने के लिए?

+2

, देखें: http://stackoverflow.com/a/10721985/65223 –

उत्तर

27

नहीं, क्षमा करें। SQL सर्वर में उपयोगकर्ता द्वारा परिभाषित फ़ंक्शंस वास्तव में सीमित हैं, क्योंकि आवश्यकता के अनुसार वे निर्धारक हैं। जहां तक ​​मुझे पता है, कोई रास्ता नहीं है।

क्या आपने विजुअल स्टूडियो के साथ SQL कोड डीबग करने का प्रयास किया है?

4

नहीं, आप नहीं कर सकते। एक stored procedure (इस function में कदम होगा)

+0

या यह एक संग्रहीत प्रक्रिया –

20

मैं अतीत में प्रवृत्ति है दो चरणों में मेरी कार्यों पर काम करने के

आप एक stored procedure से एक function फोन और डीबग कर सकते हैं। पहला चरण उन्हें सामान्य रूप से सामान्य एसक्यूएल प्रश्नों के रूप में पेश करना होगा और यह सुनिश्चित करना होगा कि मुझे इसका सही परिणाम मिल रहा है। मुझे विश्वास है कि यह वांछित प्रदर्शन कर रहा है, तो मैं इसे एक यूडीएफ में बदल दूंगा।

+0

यह मैं इसे कैसे भी कर :) – Shiva

20

मैं अस्थायी रूप से कुछ इस तरह करने के लिए अपने समारोह दोबारा लिख ​​कर इस के चारों ओर हो गया है:

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

मैं इस विधि की तरह, बहुत है रचनात्मक। वापसी तालिका में बस एक और कॉलम के रूप में डीबग आउटपुट वापस करें :-)। –

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 

जब मैं इसे चलाने .. मैं: संदेश 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) 

वोला! अब यह काम करता है :)

29

युक्ति: त्रुटि उत्पन्न करता है।

declare @Day int, @Config_Node varchar(50) 

    set @Config_Node = 'value to trace' 

    set @Day = @Config_Node 

आप यह संदेश प्राप्त होगा:

रूपांतरण विफल जब varchar मूल्य परिवर्तित डेटा प्रकार int 'पता लगाने के लिए मूल्य'।

+3

बहुत आसान हैक जो महान काम करता है। मेरी किताब में सबसे अच्छा जवाब! –

5

शैल कमांड चलाने के लिए विस्तारित प्रक्रिया xp_cmdshell का उपयोग करें। मैं इसे इस्तेमाल किया एक फाइल करने के लिए उत्पादन मुद्रित करने के लिए:

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

इस फ़ाइल debuginfo.txt बनाता है अगर यह मौजूद नहीं है। फिर यह फ़ाइल में "mytextoutput" (उद्धरण चिह्नों के बिना) टेक्स्ट जोड़ता है। फ़ंक्शन में कोई भी कॉल एक अतिरिक्त पंक्ति लिखेगा।

आपको पहले इस डीबी-सर्वर प्रॉपर्टी को सक्षम करने की आवश्यकता हो सकती है (डिफ़ॉल्ट = अक्षम), जो मुझे लगता है कि उत्पादन वातावरण के लिए डीबीए की पसंद नहीं हो सकती है।

यह करने के लिए एक वास्तविक तरीका के लिए
+1

पहले से चलाने के लिए भूल जाते हैं मत करो: EXEC sp_configure'xp_cmdshell ', 1 GO RECONFIGURE GO – Jan

+0

मत भूलना पहले से चलाने के लिए: EXEC sp_configure' शो उन्नत विकल्प ', 1 GO RECONFIGURE GO –

संबंधित मुद्दे