Ma sto per superare il valore della mia Identity Column

Ok, diciamo che questa soluzione l’ho scritta nel 2001, all’epoca non facevo uso di blogs, quindi me la sono tenuta per me e per qualche – forse – post negli apposti NG, ma nulla di più.
Oggi stavo mettendo le mani su di un mezzo programmino che mi sto scrivendo per uso interno, e cercavo un sistema elegante per sapere se la mia Identity Column con la prossima insert mi sfora il valore massimo consentito. Beh, gira che rigira, o ho cercato male io o effettivamente nulla di più elegante non ci sta.
Pure cercando nel mio account di SQL Magazine non ho trovato nulla, solo un post del 2001 di Moran ma che lascia forti dubbi e tutto dipende da quanto si usa il DB.
Non mi ritengo un DBA … questo no, e forse questa soluzione verrà castrata immediatamente, però la ritengo semplice e funzionale. Quindi a vostra disposizione.

CREATE  FUNCTION [dbo].[MAXINTVALUE](@TABLENAME VARCHAR(30)
 ,@COLUMNNAME VARCHAR(30)
)
RETURNS BIGINT

AS
BEGIN
 DECLARE @PRECISION TINYINT
 ,@MAXVAL BIGINT
 SELECT @PRECISION = COLUMNPROPERTY(OBJECT_ID(@TABLENAME),
            @COLUMNNAME,
‘PRECISION’)
 SELECT @MAXVAL = CASE @PRECISION
 WHEN 19 THEN 9223372036854775807
 WHEN 10 THEN 2147483647
 WHEN 5 THEN 32767
 END
 RETURN @MAXVAL
END

Velocemente commento con il fatto che, ovviamente, la tabella deve avere una colonna di tipo identity e che quello che ritorna è il valore massimo a seconda della scala di precisione adottata.

Con questo valore di ritorno, semplicemente facendo una cosa del tipo

IF IDENT_CURRENT(‘TABLE1’) <= DBO.MAXINTVALUE(‘TABLE1’‘FLD_ID’)

Possiamo sapere se stiamo nei limiti oppure se con qualche altro check dobbiamo fare altro.