SQL 来自函数的服务器默认列值
SQL Server Default Column value from function
我想使用函数将默认值设置为 Person
table 中的 Id
列
是这样的:
函数:
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')
运行 此代码引发错误:
Only functions and some extended stored procedures can be executed from within a function.
那么如何解决这个问题并使其作为默认值工作?
并且请不要说 "Use triggers...",因为我打算将它与 Entity Framework Core 一起用作主键的默认值。
谢谢
您需要存储过程,而不是函数:
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;
您还应该在 table 名称周围使用 quotename()
以防止发生意外情况。
那么你可以这样称呼它:
declare @lastId int;
exec dbo.GetLastId('Person', @lastid output);
update Person
set Id = @lastId;
您需要创建 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;
我想使用函数将默认值设置为 Person
table 中的 Id
列
是这样的:
函数:
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')
运行 此代码引发错误:
Only functions and some extended stored procedures can be executed from within a function.
那么如何解决这个问题并使其作为默认值工作?
并且请不要说 "Use triggers...",因为我打算将它与 Entity Framework Core 一起用作主键的默认值。
谢谢
您需要存储过程,而不是函数:
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;
您还应该在 table 名称周围使用 quotename()
以防止发生意外情况。
那么你可以这样称呼它:
declare @lastId int;
exec dbo.GetLastId('Person', @lastid output);
update Person
set Id = @lastId;
您需要创建 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;