2011-12-30 3 views
1

레코드를 삽입하고 기본 키를 반환하는 함수를 작성하여 해당 함수를 다른 쿼리의 매개 변수로 전달할 수 있습니다. 예를 들어,이 시도 :INSERT가 포함 된 값을 반환하는 SQL 함수

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

사용자 정의 함수가 기본 테이블 정보를 수정 을 사용할 수 없습니다. DML 문 INSERT, UPDATE 및 DELETE는 기본 테이블에서 사용할 수 없습니다.

따라서 함수에서 INSERT를 수행 할 수 없습니다. 문서의

해결 방법 : INSERT 명령이 사용자 정의 함수에서 허용되지 않기 때문에 SQL Server Error Messages - Msg 443

대신이 목적을 위해 저장 프로 시저를 사용해야합니다. 다음은 위의 함수와 동일한 스크립트이지만 저장 프로 시저를 사용하는 것입니다.

0

MS SQL의 함수에서는 DML 쿼리가 허용되지 않습니다. 저장 프로 시저에서 해당 쿼리를 사용할 수 있습니다.

관련 문제