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.