SQL函数返回包含INSERT的值

时间:2011-12-30 05:36:59

标签: sql sql-server

我想创建一个插入记录并返回其主键的函数,以便我可以将该函数作为另一个查询的参数传递。例如,我试过这个:

CREATE FUNCTION CreateEntity 
(
    @entityTypeId int,
    @siteId int
)
RETURNS bigint
AS
BEGIN
    DECLARE @entityId bigint;

    INSERT INTO [ObjectSystem].[Entities] ([EntityTypeId], [SiteId], [Deleted])
    VALUES (@entityTypeId, @siteId, 0);

    SELECT @entityId = SCOPE_IDENTITY();

    RETURN @entityId;
END
GO

但MSSMS突出显示INSERT查询并说“在函数中无效使用副作用运算符'Insert'。”

我希望能够使用这样的功能:

INSERT INTO OtherTable (EntityId, Name, Description) VALUES
(CreateEntity(), 'Test', 'This is a test item.'),
(CreateEntity(), 'Test', 'This is a test item.'),
(CreateEntity(), 'Test', 'This is a test item.'),
(CreateEntity(), 'Test', 'This is a test item.'),
(CreateEntity(), 'Test', 'This is a test item.'),
(CreateEntity(), 'Test', 'This is a test item.');

如果有的话,我怎样才能达到预期的效果?如果不可能,我能做些什么呢?

2 个答案:

答案 0 :(得分:5)

查看此文章:http://www.databasejournal.com/features/mssql/article.php/3348181/User-Defined-Functions-in-Microsoft-SQL-Server-2000.htm

  

无法使用用户定义的功能   修改基表信息。该   DML语句INSERT,UPDATE和   DELETE不能用于基表。

所以你不能在函数中执行INSERT。

文章解决方案:SQL Server Error Messages - Msg 443

由于在用户定义的函数中不允许使用INSERT命令,因此您必须使用存储过程来实现此目的。这是与上述函数相同的脚本,但使用存储过程:

答案 1 :(得分:0)

MS SQL中的函数不允许DML查询。您可以在存储过程中使用该查询,这应该有效。