web-dev-qa-db-de.com

TSQL Wie wird PRINT in einer benutzerdefinierten Funktion ausgegeben?

Grundsätzlich möchte ich die Anweisung PRINT in einer benutzerdefinierten Funktion verwenden, um das Debuggen zu erleichtern.

Es wird jedoch der folgende Fehler angezeigt:

Ungültige Verwendung eines nebenwirkenden oder zeitabhängigen Operators in 'PRINT' innerhalb einer Funktion.

Geht das nicht

Wie auch immer, um das Debuggen von benutzerdefinierten Funktionen zu unterstützen?

61
c00ke

Nein Entschuldigung. Benutzerdefinierte Funktionen in SQL Server sind sehr eingeschränkt, da sie deterministisch sein müssen. Soweit ich weiß, führt kein Weg daran vorbei.

Haben Sie versucht, den SQL-Code mit Visual Studio zu debuggen?

32
Tor Haugen

Tipp: Fehler erzeugen.

declare @Day int, @Config_Node varchar(50)

    set @Config_Node = 'value to trace'

    set @Day = @Config_Node

Sie erhalten diese Nachricht:

Die Konvertierung ist fehlgeschlagen, wenn der varchar-Wert 'value to trace' in den Datentyp int konvertiert wurde.

42
Estevez

In der Vergangenheit habe ich meine Funktionen in zwei Phasen bearbeitet. Der erste Schritt wäre, sie als normale SQL-Abfragen zu behandeln und sicherzustellen, dass ich die richtigen Ergebnisse erhalte. Nachdem ich sicher bin, dass es wie gewünscht funktioniert, würde ich es in eine UDF konvertieren.

24
TheTXI

Ich habe das umgangen, indem ich meine Funktion vorübergehend auf Folgendes umgeschrieben habe:

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)
21
v1964

Verwenden Sie die erweiterte Prozedur xp_cmdshell, um einen Shell-Befehl auszuführen. Ich habe es verwendet, um die Ausgabe in eine Datei zu drucken:

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

Dadurch wird die Datei debuginfo.txt erstellt, falls sie nicht vorhanden ist. Anschließend wird der Datei der Text "mytextoutput" (ohne Anführungszeichen) hinzugefügt. Bei jedem Aufruf der Funktion wird eine zusätzliche Zeile geschrieben.

Möglicherweise müssen Sie diese Datenbankservereigenschaft zuerst aktivieren (Standard = deaktiviert), was meiner Ansicht nach für die Produktionsumgebungen jedoch möglicherweise nicht den Vorstellungen von Datenbankservern entspricht.

7
LDerckx

Nein, du kannst nicht.

Sie können ein function von einem stored procedure und debuggen ein stored procedure (dies wird in das function springen)

4
Quassnoi

Sie können versuchen, die Variable zurückzugeben, die Sie überprüfen möchten. Z.B. Ich habe diese Funktion:

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

Wenn ich es ausführe, erhalte ich: Meldung 241, Ebene 16, Status 1, Zeile 1 Die Konvertierung ist fehlgeschlagen, wenn Datum und/oder Uhrzeit aus der Zeichenfolge konvertiert wurden.

Arghh !!

Also was mache ich?

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

Und ich bekomme '25'. Also, ich bin um eins weg und so wechsle ich zu ..

set @day_part = substring(@date, 0, @point_ix + 1)

Voila! Jetzt gehts :)

0
h.alex