use*_*503 41 sql sql-server sql-server-2008
我的sql函数中有以下代码:
if @max_chi > -999
begin
INSERT INTO CH_TABLE(X1, X2, VALUE)
VALUES(cur_out.sessionnumber, maxpos, max_chi)
commit
end
Run Code Online (Sandbox Code Playgroud)
以下是SQL Server 2008查询,它给我一个错误:
在函数中无效使用副作用运算符"INSERT".
为什么我不允许这样做?我该怎么做才能解决这个问题?
Aar*_*and 70
您不能使用函数将数据插入基表.函数返回数据.这被列为了第一个文档中的限制:
用户定义的函数不能用于执行修改数据库状态的操作.
"修改数据库状态"包括更改数据库中的任何数据(尽管表变量是OP在3年前不会关心的明显例外 - 此表变量仅在函数调用期间存在且不影响以任何方式的基础表).
您应该使用存储过程,而不是函数.
小智 9
我找到了一种方法来进行插入或更新,因此您只需要替换@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
Run Code Online (Sandbox Code Playgroud)