2011-12-30 2 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 и говорит «Invalid использование бокового осуществления оператора„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

определяемые пользователем функции не могут быть использованы для изменения информации о базовой таблицы. Операторы DML INSERT, UPDATE и DELETE нельзя использовать в базовых таблицах.

Таким образом, вы не можете использовать INSERT в функции.

Решение статьи: SQL Server Error Messages - Msg 443

Поскольку команда INSERT не допускается в определенной пользователем функции, вы должны использовать хранимую процедуру для этой цели вместо этого. Вот тот же скрипт, что и указанная выше функция, но с использованием хранимой процедуры:

0

DML-запрос в MS SQL не допускается. Вы можете использовать этот запрос в хранимой процедуре, и это должно работать.

Смежные вопросы