잘못된 사용 부작용 연산자 함수 내에 삽입
제 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
'programing' 카테고리의 다른 글
Oracle은 오류 발생 시 트랜잭션을 롤백합니까? (0) | 2023.10.01 |
---|---|
시스템의 대안.웹.보안.회원가입.aspnetcore에서 암호 생성(netcore app1.0) (0) | 2023.10.01 |
-> C 구조체의 형식 인수가 잘못되었습니다. (0) | 2023.10.01 |
주소 ()를 취하고 값을 주는 함수 (0) | 2023.10.01 |
IN 절의 MySQL 여러 열 (0) | 2023.09.26 |