tsql - lanzar - sql server print console
TSQL ¿Cómo se imprime PRINT en una función definida por el usuario? (7)
Básicamente, quiero usar la instrucción PRINT
dentro de una función definida por el usuario para ayudarme en la depuración.
Sin embargo, recibo el siguiente error;
Uso no válido del operador de efecto secundario 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 función definida por el usuario?
Consejo: generar error.
declare @Day int, @Config_Node varchar(50)
set @Config_Node = ''value to trace''
set @Day = @Config_Node
Recibirás este mensaje:
La conversión falló al convertir el valor varchar ''value to trace'' al tipo de datos int.
He trabajado 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.
Lo solucioné 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)
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é.
¿Has probado a depurar el código SQL con Visual Studio?
No, no puedes.
Puede invocar una function
desde un stored procedure
y depurar un stored procedure
(esto entrará en la function
)
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 ejecuto ... Obtengo: Msg 241, nivel 16, estado 1, línea 1 La conversión falló al convertir la fecha y / o 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, me voy por uno y entonces cambio a ...
set @day_part = substring(@date, 0, @point_ix + 1)
Voila! Ahora funciona :)
Use 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 deba 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.