2016-01-03 13 views
5

Devo controllare se alcuni record con condizioni specifiche esistono in una tabella che potrebbe non esistere e devo farlo in una funzione scalare.Verificare se ci sono dei record in una tabella che potrebbero non esistere

Ecco il mio codice:

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 

Mentre provarlo in SQL Server esegue la seguente dichiarazione:

SELECT dbo.CheckIfRecordsExistInTestTable() 

Ogni volta TestTable esiste restituisce il risultato previsto. Ma ogni volta che non lo fa, SQL Server solleva un'eccezione (Nome oggetto non valido 'TestTable') e non riesco a ottenere quello che mi aspetto (voglio un valore di ritorno pari a zero in questa situazione). Quindi cosa proponi di fare per questo problema che può essere codificato in una funzione scalare?

risposta

4

Provare a cambiare l'function come questo

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; 

Per saperne di più sul motivo dietro l'errore che si stanno ottenendo verificare la risposta di Martin.

5

L'altra risposta fornisce una soluzione corretta.

Quanto al perché hai trovato il problema ...

Si tratta di un errore di tempo di compilazione.

Se l'istruzione fa riferimento a una compilazione di un oggetto inesistente viene rimandata fino a poco prima dell'esecuzione, ma comunque l'intera istruzione deve essere compilata in un piano di esecuzione prima dell'esecuzione.

Questo errore si verifica quando la tabella non esiste e l'esecuzione di tale istruzione non inizia nemmeno.

(piano di esecuzione che si cerca di creare - utilizzando un passthru predicate per evitare la valutazione della condizione se il caso non raggiunto)

enter image description here

Nella soluzione della SELECT contro testtable viene spostato in un diversa dichiarazione. La compilazione di questa affermazione è ancora differita e poiché la dichiarazione non viene mai eseguita, tutto funziona correttamente.

+2

Tu sei l'uomo genio. Ho aggiornato la mia risposta. Sono solo un principiante in 'Sql Server' che impara tutte queste cose :) –

0

funzione di aggiornamento in questo modo:

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