[SQL Server函数的默认列值

问题描述 投票:-1回答:2

我想使用功能将默认值设置为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一起用作主键的默认值。

谢谢

sql sql-server ssms
2个回答
0
投票

您想要一个存储过程,而不是一个函数:

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;

0
投票

您需要创建stored procedure而不是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
© www.soinside.com 2019 - 2024. All rights reserved.