TSQL Как вы вывести PRINT в пользовательской функции?
В принципе, я хочу использовать инструкцию PRINT
внутри пользовательской функции, чтобы помочь моей отладке.
Однако я получаю следующую ошибку:
Неправильное использование побочного или зависящего от времени оператора в 'PRINT' внутри функции.
Можно ли это сделать?
В любом случае, чтобы помочь отладке пользовательских функций отладки?
Ответы
Ответ 1
Нет, извините. Определенные пользователем функции в SQL Server действительно ограничены из-за требования, чтобы они были детерминированными. Насколько мне известно, никоим образом не обойти это.
Вы пытались отладить код SQL с помощью Visual Studio?
Ответ 2
Подсказка:
генерировать ошибку.
declare @Day int, @Config_Node varchar(50)
set @Config_Node = 'value to trace'
set @Day = @Config_Node
Вы получите это сообщение:
Ошибка конверсии при преобразовании значения значения varchar 'для трассировки'
к типу данных int.
Ответ 3
Я обошел это, временно переписав свою функцию примерно так:
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)
Ответ 4
В прошлом я работал над своими функциями в два этапа. Первый этап - относиться к ним как к нормальным SQL-запросам и убедиться, что я получаю от него правильные результаты. После того, как я уверен, что он выполняет по желанию, я бы превратил его в UDF.
Ответ 5
Используйте расширенную процедуру xp_cmdshell для запуска команды оболочки. Я использовал его для вывода вывода в файл:
exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'
Это создает файл debuginfo.txt, если он не существует. Затем он добавляет в файл текст "mytextoutput" (без кавычек). Любой вызов функции будет писать дополнительную строку.
Возможно, вам нужно сначала включить это свойство db-server (по умолчанию = отключено), что, я понимаю, может быть не по нраву dba для производственных сред.
Ответ 6
Нет, вы не можете.
Вы можете вызвать function
из stored procedure
и отладить a stored procedure
(это будет шаг в function
)
Ответ 7
Вы можете попробовать вернуть переменную, которую хотите проверить.
Например. У меня есть эта функция:
--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
Когда я запускаю его, я получаю:
Msg 241, уровень 16, состояние 1, строка 1
Ошибка конверсии при преобразовании даты и/или времени из символьной строки.
Arghh!!
Итак, что мне делать?
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
И я получаю "25". Итак, я отключен одним, и поэтому я перехожу к..
set @day_part = substring(@date, 0, @point_ix + 1)
Voila! Теперь он работает:)