2009-02-25 19 views
46

In pratica, desidero utilizzare l'istruzione PRINT all'interno di una funzione definita dall'utente per facilitare il debug.TSQL Come si stampa PRINT in una funzione definita dall'utente?

Tuttavia, sto ricevendo il seguente errore;

Uso non valido di operatore a effetto collaterale o dipendente dal tempo in "STAMPA" all'interno di una funzione.

Questo non può essere fatto?

Ad ogni modo per aiutare il mio debug di funzione definito dall'utente?

+2

di un modo vero e proprio per fare questo, si veda: http://stackoverflow.com/a/10721985/65223 –

risposta

27

No, mi dispiace. Le funzioni definite dall'utente in SQL Server sono davvero limitate, a causa del requisito che siano deterministiche. Assolutamente no, per quanto ne so.

Hai provato a eseguire il debug del codice SQL con Visual Studio?

4

No, non è possibile.

È possibile chiamare un function da un stored procedure e debug di un stored procedure (questo farà un passo nella function)

+0

o renderlo una stored procedure –

20

ho avuto la tendenza in passato a lavorare su mie funzioni in due fasi. La prima fase sarebbe trattarli come query SQL abbastanza normali e assicurarsi di ottenere i risultati corretti. Dopo che sono sicuro che si sta comportando come desiderato, lo convertirò in UDF.

+0

Questo è come lo faccio troppo :) – Shiva

20

ho avuto intorno a questo riscrivendo temporaneamente la mia funzione di qualcosa di simile:

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

mi piace questo metodo, molto creativo. Basta restituire l'output di debug come un'altra colonna nella tabella di ritorno :-). –

0

si può provare a restituire la variabile che si desidera esaminare. E.g. Ho questa funzione:

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

quando l'eseguo .. ottengo: Msg 241, livello 16, stato 1, riga 1 Conversione non riuscita durante la conversione della data e/o nel tempo da una stringa di caratteri.

Arghh !!

Quindi, cosa devo fare?

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 

E ottengo "25". Quindi, sono fuori da uno e così cambio a ..

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

Voilà! Ora funziona :)

29

Suggerimento: generare errore.

declare @Day int, @Config_Node varchar(50) 

    set @Config_Node = 'value to trace' 

    set @Day = @Config_Node 

Otterrete questo messaggio:

Conversione non riuscita durante la conversione del valore varchar 'il valore di tracciare' al tipo di dati int.

+3

Hack molto semplice che funziona benissimo. La migliore risposta nel mio libro! –

5

Utilizzare la procedura estesa xp_cmdshell per eseguire un comando di shell. L'ho usato per stampare output in un file:

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

Questo crea il file debuginfo.txt se non esiste. Quindi aggiunge il testo "mytextoutput" (senza virgolette) al file. Qualsiasi chiamata alla funzione scriverà una riga aggiuntiva.

Potrebbe essere necessario abilitare prima questa proprietà di db-server (default = disabilitata), che a mio avviso può non essere gradita a dba per gli ambienti di produzione.

+1

Non dimenticare di eseguire in anticipo: sp_configure'xp_cmdshell EXEC', 1 GO RECONFIGURE GO – Jan

+0

Non dimenticare di eseguire in anticipo: EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO –

Problemi correlati