2017-02-21 2 views
0

Ich habe eine sehr einfache Abfrage, die eine große Tabelle von Standorten untersucht und Details über bestimmte Straße zurückgibt. Ich versuche, hoch zu erhalten - niedrige Zahlen, um eine weitere einreihige bevölkern und haben gewählt, eine Funktion zu verwenden, um diesesSQL Server mit der Funktion

CREATE FUNCTION [dbo].[GetMaxStrNo] 
    (@StrFullName varchar) 
RETURNS INT 
AS 
BEGIN 
    RETURN 
     (SELECT 
      MAX(CAST(apt_no AS INT)) 
     FROM 
      location 
     WHERE 
      location_name = @StrFullName 
      AND ISNUMERIC(apt_no) = 1) 
END 
GO 

Versuchen zu tun, wie ich die Ergebnisse möglicherweise NULL zurückkommen, wie wenn sie von meinem Haupt-Prozedur namens

SET @MaxStrNo = dbo.GetMaxStrNo (@StrFullName) 

Jede Hilfe würde dankbar geschätzt werden.

Vielen Dank

+0

könnten Sie den Wert sind vorbei, die in der Tabelle – Sankar

+0

StrFullName varchar nicht existiert ist StrFullName varchar (1), so haben Sie wahrscheinlich nicht location_name in der Datenbank gleich dem ersten Buchstaben des StrFullName –

Antwort

1

Das erste offensichtliche Problem ist die Erklärung varchar(). In SQL Server sollte dies immer eine Länge haben:

CREATE FUNCTION [dbo].[GetMaxStrNo](
    @StrFullName varchar(max) 
) RETURNS INT 

Der Rest Ihrer Funktion hat ein anderes Problem. Die isnumeric() in der where Klausel wird einen Fehler nicht verhindern. Verwenden Sie try_convert() um einen Fehler zu verhindern:

BEGIN 
    RETURN (SELECT MAX(TRY_CONVERT(int, apt_no)) 
      FROM location 
      WHERE location_name = @StrFullName and ISNUMERIC(apt_no) = 1 
      ); 
END; 

Die isnumeric() in der where Klausel ist streng optional in diesem Fall.

+0

Vielen Dank Gordon ... Erstmalig gearbeitet ... All diese Ohuren, müssen einen Experten bekommen oder zumindest ein Buch neu schreiben :) Prost – TheBigChap

Verwandte Themen