2011-12-30 49 views
1

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

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 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.'); 

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

回答

5

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

用户定义函数不能用于 修改基表信息。 DOL语句INSERT,UPDATE和 DELETE不能在基表上使用。

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

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

由于INSERT命令不能在用户定义的函数允许的,你必须使用一个存储过程来完成此任务。这里是与上述功能相同的脚本,但使用存储过程:

0

DML查询不允许在MS SQL中的函数中使用。您可以在存储过程中使用该查询,并且应该可以工作。

相关问题