Если это всегда нужно использовать для столбцов идентификаторов, вы можете использовать переменную
SELECT ISNULL(IDENT_CURRENT(@sTableName),0)+1
В противном случае вам нужно использовать динамический SQL (применяются обычные предостережения относительно внедрения SQL).Кроме того, я все равно сомневаюсь в причинах этого, если только у вас нет проблем с параллелизмом.
Я изменил тип ваших параметров на sysname
, поскольку это более уместно.1009 *
CREATE PROCEDURE [dbo].[spGenerateID]
(
@sFieldName sysname,
@sTableName sysname,
@id int output
)
AS
BEGIN
DECLARE @dynsql NVARCHAR(1000)
SET @dynsql = 'select @id =isnull(max([' + @sFieldName + ']),0)+1 from [' + @sTableName + '];'
EXEC sp_executesql @dynsql, N'@id int output', @id OUTPUT
END
Пример использования
DECLARE @id int
EXECUTE [dbo].[spGenerateID]
'id'
,'MYTABLE'
,@id OUTPUT
SELECT @id