簡體   English   中英

來自函數的 SQL Server 默認列值

[英]SQL Server Default Column value from function

我想使用如下函數將默認值設置為Person表中的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')

運行此代碼會引發錯誤:

只有函數和一些擴展存儲過程可以從函數內部執行。

那么如何解決這個問題並使其作為默認值工作呢?

並且請不要說“使用觸發器...”,因為我打算將它與 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;

您還應該在表名周圍使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM