2009-02-25 33 views
46

Básicamente quiero usar la declaración PRINT dentro de una función definida por el usuario para ayudarme en la depuración.TSQL ¿Cómo se imprime PRINT en una función definida por el usuario?

Sin embargo me aparece el siguiente error;

Uso no válido de lado con efecto o el operador dependiente del tiempo en 'imprimir' dentro de una función.

¿No se puede hacer esto?

De todos modos para ayudar a mi depuración de función definida por el usuario?

+2

una manera efectiva de hacer esto, consulte: http://stackoverflow.com/a/10721985/65223 –

Respuesta

27

No, lo siento. Las funciones definidas por el usuario en SQL Server son realmente limitadas, debido a un requisito de que sean deterministas. No hay forma de evitarlo, hasta donde yo sé.

¿Ha intentado depurar el código SQL con Visual Studio?

4

No, no puedes.

Puede llamar a un function de un stored procedure y depurar un stored procedure (esto se suba al function)

+0

o que sea un procedimiento almacenado –

20

He tendido en el pasado para trabajar en mis funciones en dos etapas. La primera etapa sería tratarlos como consultas SQL bastante normales y asegurarme de obtener los resultados correctos. Después de estar seguro de que está funcionando como lo deseaba, lo convertiría en un UDF.

+0

Así es como lo hago también :) – Shiva

20

llegué alrededor de esta reescribiendo temporalmente mi función a algo como esto:

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

me gusta este método, muy creativo. Simplemente devuelva la salida de depuración como otra columna en la tabla de retorno :-). –

0

Usted puede tratar de devolver la variable que desea inspeccionar. P. ej. Tengo esta función:

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

Cuando lo funciono .. me sale: Msg 241, nivel 16, estado 1, línea 1 no conversión al convertir fecha y/u hora de cadena de caracteres.

Arghh !!

Entonces, ¿qué debo hacer?

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 

Y obtengo '25'. Por lo tanto, estoy fuera de uno y entonces cambio a ...

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

Voila! Ahora funciona :)

29

Sugerencia: generar error.

declare @Day int, @Config_Node varchar(50) 

    set @Config_Node = 'value to trace' 

    set @Day = @Config_Node 

Usted recibirá este mensaje:

Error de conversión al convertir el valor varchar 'valor de rastrear' a tipo de datos int.

+3

truco muy simple que funciona muy bien. La mejor respuesta en mi libro! –

5

Utilice el procedimiento extendido xp_cmdshell para ejecutar un comando de shell. Lo utilicé para imprimir la salida a un archivo:

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

Esto crea el archivo debuginfo.txt si no existe. Luego agrega el texto "mytextoutput" (sin comillas) al archivo. Cualquier llamada a la función escribirá una línea adicional.

Es posible que tenga que habilitar esta propiedad db-server primero (predeterminado = desactivado), aunque me doy cuenta de que puede no ser del agrado de los entornos de producción de dba.

+1

No se olvide de ejecutar antemano: sp_configure'xp_cmdshell EXEC', 1 GO RECONFIGURE GO – Jan

+0

No se olvide de ejecutar antemano: EXEC sp_configure 'Mostrar opciones avanzadas', 1 GO GO RECONFIGURE –

Cuestiones relacionadas