2016-01-03 7 views
5

Ich muss überprüfen, ob einige Datensätze mit bestimmten Bedingungen in einer Tabelle existieren, die möglicherweise nicht existieren, und ich muss dies in einer skalaren Funktion tun.Überprüfen, ob Datensätze in einer Tabelle vorhanden sind, die nicht existieren

Hier ist mein Code:

CREATE FUNCTION CheckIfRecordsExistInTestTable() 
RETURNS INT 
BEGIN 
DECLARE @Result INT 
SELECT @Result = 
CASE WHEN OBJECT_ID('TestTable') IS NULL THEN 0 
ELSE 
CASE WHEN EXISTS(SELECT * FROM TestTable) THEN 
1 
ELSE 
0 
END 
END 
RETURN @Result 
END 

Während es in SQL Server die folgende Anweisung ausführen versuchen:

SELECT dbo.CheckIfRecordsExistInTestTable() 

Wenn TestTable existiert es meine erwartete Ergebnis zurückgibt. Aber wann immer es nicht auftritt, löst SQL Server eine Ausnahme aus (ungültiger Objektname 'TestTable') und ich kann nicht bekommen, was ich erwarte (ich möchte in dieser Situation einen Null-Rückgabewert haben). Was also schlagen Sie für dieses Problem vor, das zu einer Skalarfunktion kodiert werden kann?

Antwort

4

versuchen, die function wie diese

CREATE FUNCTION Checkifrecordsexistintesttable() 
returns INT 
    BEGIN 
     DECLARE @Result INT 

     IF Object_id('TestTable') IS NULL 
     SET @Result = 0 
     ELSE 
     SELECT @Result = CASE 
          WHEN EXISTS(SELECT 1 FROM testtable) THEN 1 
          ELSE 0 
         END 

     RETURN @Result 
    END; 

Um zu wissen, mehr über den Grund für den Fehler Ändern Sie überprüfen Antwort Martin zu bekommen.

5

Die andere Antwort gibt eine korrekte Problemumgehung.

Wie, warum Sie das Problem bekommen ...

Dies ist eine Kompilierung Fehler.

Wenn die Anweisung auf eine nicht vorhandene Objektkompilierung verweist, wird sie erst kurz vor der Ausführung zurückgestellt, aber letztendlich muss die gesamte Anweisung noch in einen Ausführungsplan kompiliert werden, bevor sie ausgeführt wird.

Dies schlägt fehl, wenn die Tabelle nicht existiert und die Ausführung dieser Anweisung nicht einmal beginnt.

(Ausführungsplan, um es zu schaffen versucht - eine passthru predicate mit Auswertung der Bedingung zu vermeiden, wenn der Fall nicht erfüllt)

enter image description here

In der Umgehung der SELECT gegen testtable in eine bewegte verschiedene Anweisung. Die Kompilierung dieser Anweisung wird immer noch zurückgestellt, und da die Anweisung nie ausgeführt wird, funktioniert alles einwandfrei.

+2

Sie sind Genie Mann. Ich habe meine Antwort aktualisiert. Bin gerade ein Anfänger in 'Sql Server', der all diese Sachen lernt :) –

0

Update-Funktion wie folgt aus:

CREATE FUNCTION CheckIfRecordsExistInTestTable() 
RETURNS INT 
BEGIN 
DECLARE @Result INT 
SELECT @Result = case when count(1) = 0 then 0 else 1 end from sys.tables where name = 'TestTable' 

RETURN @result 

END 
Verwandte Themen