Есть ли другой лучший способ выполнить эту операцию?
-- USE EXAMPLE: EXEC GetFirstIdInGap @tableName ='Employees',@column='IdEmployee'
CREATE PROCEDURE GetFirstIdInGap
(@tableName sysname,
@column sysname)
AS
IF @tableName IS NOT NULL and @column IS NOT NULL
BEGIN
DECLARE @col varchar(50), @col2 varchar(50)
SET @col = 'A.' + @column;
SET @col2 = 'A2.' + @column;
EXEC ('SELECT ISNULL((MIN('+@col+') - 1),(SELECT ISNULL(MAX('+@column+')+1,1) FROM '+@tableName+'))
AS '+@column+'
FROM '+@tableName+' AS a
LEFT JOIN '+@tableName+' AS a2
ON '+@col2+' = '+@col+' - 1
WHERE '+@col2+' IS NULL AND '+@col+' > 1');
END
GO
Он получает первый свободный идентификатор (если есть пробелы) или последний +1 с данными @tableName и @column. Если строк нет, возвращается первый идентификатор = 1.
UPDATE:
Для тех, кто спросил о том, зачем мне нужны пробелы в удостоверениях личности, я объясню свою проблему (хотя я не хотел в нее вникать). Я работаю с приложениями C # Winforms против других приложений прошивки, которые имеют серьезные ограничения памяти . Одним из таких ограничений является то, что я могу использовать только максимальное значение кода 65536. Эти коды эквивалентны идентификаторам базы данных, а в некоторых случаях код встроенного программного обеспечения достиг значения 65536. Вот почему повторное использование пробелов было бы замечательно для меня. 1012 *