TSQL ¿Cómo se genera la impresión en una función definida por el usuario?


Básicamente quiero usar la instrucción PRINT dentro de una función definida por el usuario para ayudar a mi depuración.

Sin embargo, estoy recibiendo el siguiente error;

Uso no válido del operador de efecto lateral o dependiente del tiempo en 'PRINT' dentro de una función.

¿No se puede hacer esto?

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

Author: Luke Girvin, 2009-02-25

7 answers

No, lo siento. Las funciones definidas por el usuario en SQL Server son realmente limitadas, debido al requisito de que sean deterministas. No hay forma de evitarlo, que yo sepa.

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

 28
Author: Tor Haugen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 16:07:29

Tip: generar error.

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

Recibirá este mensaje:

La conversión falló al convertir el valor de varchar 'value to trace' al tipo de datos int.

 34
Author: Estevez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 14:06:44

He tendido en el pasado a trabajar en mis funciones en dos etapas. La primera etapa sería tratarlas como consultas SQL bastante normales y asegurarse de que estoy obteniendo los resultados correctos. Después de que estoy seguro de que está funcionando como se desea, entonces me gustaría convertirlo en un UDF.

 23
Author: TheTXI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 16:09:50

Conseguí evitar esto 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)
 21
Author: sth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-03 22:31:02

Utilice el procedimiento extendido xp_cmdshell para ejecutar un comando de shell. Lo usé 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 necesite habilitar esta propiedad db-server primero (default = disabled), que me doy cuenta de que puede no ser del agrado de los dba para entornos de producción.

 7
Author: LDerckx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-07 14:38:18

No, no puedes.

Puede llamar a function desde a stored procedure y depurar a stored procedure (esto pasará a function)

 4
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 16:08:08

Puede intentar devolver la variable que desea inspeccionar. Por ejemplo, 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 ejecute.. Tengo: Msg 241, Nivel 16, Estado 1, Línea 1 La conversión falló al convertir la fecha y / o la hora de la cadena de caracteres.

Arghh!!

Entonces, ¿qué hago?

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 por uno y por lo que cambio a..

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

Voila! Ahora funciona :)

 0
Author: h.alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-09 11:23:47