TSQL Как вы выводите PRINT в пользовательской функции? - PullRequest
60 голосов
/ 25 февраля 2009

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

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

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

Разве это не может быть сделано?

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

Ответы [ 7 ]

41 голосов
/ 07 февраля 2013

Совет: генерировать ошибку.

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

Вы получите это сообщение:

Преобразование не удалось при преобразовании значения varchar 'value to trace' к типу данных int.

31 голосов
/ 25 февраля 2009

Нет, извините. Пользовательские функции в SQL Server действительно ограничены из-за требования быть детерминированными. Насколько я знаю, это никак не обойти.

Вы пробовали отлаживать код SQL с помощью Visual Studio?

24 голосов
/ 25 февраля 2009

В прошлом я обычно работал над своими функциями в два этапа. Первым этапом было бы рассматривать их как вполне нормальные запросы SQL и убедиться, что я получаю правильные результаты. После того, как я уверен, что он работает так, как хотелось бы, я бы преобразовал его в UDF.

21 голосов
/ 03 октября 2009

Я справился с этим, временно переписав свою функцию примерно так:

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)
7 голосов
/ 07 октября 2014

Используйте расширенную процедуру xp_cmdshell для запуска команды оболочки. Я использовал его для печати вывода в файл:

exec xp_cmdshell 'echo "mytextoutput" >> c:\debuginfo.txt'

Это создает файл debuginfo.txt, если он не существует. Затем он добавляет текст «mytextoutput» (без кавычек) в файл. Любой вызов функции напишет дополнительную строку.

Возможно, вам сначала потребуется включить это свойство db-server (по умолчанию = отключено), хотя я понимаю, что он может не понравиться dba для производственных сред.

4 голосов
/ 25 февраля 2009

Нет, вы не можете.

Вы можете вызвать function из stored procedure и отладить stored procedure (это перейдет в function)

0 голосов
/ 09 ноября 2012

Вы можете попытаться вернуть переменную, которую хотите проверить. Например. У меня есть эта функция:

--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

Когда я запускаю это .. я получаю: Сообщение 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)

Вуаля! Теперь это работает:)

...