SQL Значение по умолчанию для столбца сервера из функции - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу установить значение по умолчанию для столбца Id в таблице Person с функцией, которая выглядит следующим образом:

Функция:

IF OBJECT_ID ( 'GetLastId','FN') IS NOT NULL   
    DROP function GetLastId;  
GO  

CREATE FUNCTION [dbo].[GetLastId]
    (@TableName nvarchar(max)) 
RETURNS int
AS
BEGIN
    DECLARE @LastId int;
    DECLARE @sql nvarchar(max);

    SET @sql = 'SELECT @LastId = ISNULL(MAX(Id), 0) + 1 FROM ' + @TableName + ';'

    EXECUTE sp_executesql @sql, N'@LastId int output', @LastId = @LastId output;

    RETURN @LastId
END

, а затем:

UPDATE Person 
SET Id = dbo.GetLastId('Person')

Запуск этого кода приводит к ошибке:

Из функции могут быть выполнены только функции и некоторые расширенные хранимые процедуры.

Так как исправить это и заставить его работать как значение по умолчанию?

И, пожалуйста, не говорите «Использовать триггеры ...», поскольку я намерен использовать его с Entity Framework Core в качестве значения по умолчанию для первичных ключей.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Вам нужно создать stored procedure вместо function

create procedure [dbo].[GetLastId] (
    @TableName nvarchar(max),
    @ColumnName nvarchar(200),
    @LastId int output
) as
begin
   declare @sql nvarchar(max);

   set @sql = 'select @LastId = ISNULL(MAX('+ @ColumnName +'), 0) + 1 from ' + @TableName + ';'
   EXECUTE sp_executesql @sql,
                         N'@LastId int output',
                         @LastId=@LastId output;
end;

Затем вы можете выполнить sp, как показано ниже

declare @lastId int

exec dbo.GetLastId 'Person', 'Id' , @lastid output;
select @lastId

update Person
set Id = @lastId;
0 голосов
/ 05 февраля 2020

Требуется хранимая процедура, а не функция:

create procedure [dbo].[GetLastId] (
    @TableName nvarchar(max),
    @LastId int output
) as
begin
   declare @sql nvarchar(max);

   set @sql = 'select @LastId = ISNULL(MAX(Id), 0) + 1 from ' + @TableName + ';'
   EXECUTE sp_executesql @sql,
                         N'@LastId int output',
                         @LastId=@LastId output;
end;

Вы также должны использовать quotename() вокруг имени таблицы, чтобы предотвратить непредвиденные события.

Затем вы вызываете это как:

declare @lastId int;

exec dbo.GetLastId('Person', @lastid output); 

update Person
    set Id = @lastId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...