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?
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?
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.
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.
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)
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.
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
)
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 :)
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