Подтвердить что ты не робот

TSQL Как вы вывести PRINT в пользовательской функции?

В принципе, я хочу использовать инструкцию PRINT внутри пользовательской функции, чтобы помочь моей отладке.

Однако я получаю следующую ошибку:

Неправильное использование побочного или зависящего от времени оператора в 'PRINT' внутри функции.

Можно ли это сделать?

В любом случае, чтобы помочь отладке пользовательских функций отладки?

4b9b3361

Ответ 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! Теперь он работает:)