programing

잘못된 사용 부작용 연산자 함수 내에 삽입

lovejava 2023. 10. 1. 19:00

잘못된 사용 부작용 연산자 함수 내에 삽입

제 sql 함수에는 다음 코드가 있습니다.

if @max_chi > -999
begin
    INSERT INTO CH_TABLE(X1, X2, VALUE)
    VALUES(cur_out.sessionnumber, maxpos, max_chi)

    commit
end

다음은 SQL Server 2008 쿼리이며 오류가 발생합니다.

함수 내에서 부작용 연산자 'INSERT'를 잘못 사용했습니다.

왜 나는 이것을 할 수 없는 겁니까?이 문제를 해결하려면 어떻게 해야 합니까?

기본 테이블에 데이터를 삽입하는 함수는 사용할 수 없습니다.함수는 데이터를 반환합니다.이는 설명서의 첫 번째 제한 사항으로 나열되어 있습니다.

데이터베이스 상태를 수정하는 작업을 수행하는 데 사용자 정의 함수를 사용할 수 없습니다.

"데이터베이스 상태 수정"은 데이터베이스의 모든 데이터를 변경하는 것을 포함합니다(테이블 변수는 3년 전에는 OP가 신경 쓰지 않았을 명백한 예외이지만 - 이 테이블 변수는 함수 호출 기간 동안만 존재하며 기본 테이블에는 어떤 방식으로도 영향을 미치지 않습니다).

함수가 아닌 저장 프로시저를 사용해야 합니다.

면책 사항:이것은 해결책이 아니라 무언가를 시험하기 위한 해킹에 가깝습니다. 데이터베이스 상태를 수정하는 작업을 수행하는 데 사용자 정의 함수를 사용할 수 없습니다.

sqlcmd를 이용하여 insert 또는 update하는 한가지 방법을 찾았습니다.그러니 안에 있는 코드만 교체하면 됩니다.@sql변수.

CREATE FUNCTION [dbo].[_tmp_func](@orderID NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @sql varchar(4000), @cmd varchar(4000)
SELECT @sql = 'INSERT INTO _ord (ord_Code) VALUES (''' + @orderID + ''') '
SELECT @cmd = 'sqlcmd -S ' + @@servername +
              ' -d ' + db_name() + ' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN 1
END

함수는 기본 테이블 정보를 수정하는 데 사용할 수 없으며, 저장 프로시저를 사용합니다.

선언된 테이블에서 삽입/업데이트/삭제만 사용하는 경우(SQL 2014 사용 중) 예외가 있습니다.이 삽입/업데이트/삭제 문에는 OUTPUT 문이 포함될 수 없습니다.또 다른 제한 사항은 선언 테이블에 병합(MERGE)을 수행할 수 없다는 것입니다.Merge 문을 분해했지만 작동하지 않았습니다. 작동하지 않은 문을 삽입/업데이트/삭제했습니다.

저장 프로시저로 변환하지 않은 이유는 저장 프로시저보다 테이블 기능이 빨랐기 때문입니다.저장 절차를 통해 통계가 있는 Temp-Table을 사용할 수 있음에도 불구하고 말입니다.저는 테이블 기능이 매우 빠른 것이 필요했습니다, 왜냐하면 그것은 20-K 회/일이라고 불려지기 때문입니다.이 테이블 함수는 데이터베이스를 업데이트하지 않습니다.

함수에 NewId()와 RAND() SQL 함수가 허용되지 않는다는 것도 확인했습니다.

언급URL : https://stackoverflow.com/questions/18389503/invalid-use-side-effecting-operator-insert-within-a-function