在函数中无效使用副作用运算符“INSERT” - 在函数中多次插入

WeD*_*com 5 sql-server t-sql functions

如果这不是正确的论坛,请让我知道并为我移动它。

我刚刚在标量函数的末尾有一堆这样的插入:

   INSERT INTO [Raptor].[dbo].[UserRole]
           ([RoleId]
           ,[UserId])
     VALUES
           (3
           ,@NewUserID)

    INSERT INTO [Raptor].[dbo].[UserRole]
               ([RoleId]
               ,[UserId])
         VALUES
               (5
               ,@NewUserID)
Run Code Online (Sandbox Code Playgroud)

A-K*_*A-K 11

在 T-SQL 中,您不能修改函数中的任何数据。没有直接的方法可以解决它。有一些晦涩的黑客,但我不会使用它们。使用存储过程。

黑客,引自 Erland Sommarskog:

CREATE FUNCTION loophole(@i int) RETURNS varchar(20) AS
  BEGIN
     DECLARE @sql varchar(MAX),
             @cmd varchar(4000)
     SELECT @sql = ' UPDATE rsci ' +
                   ' SET b = CASE ' + ltrim(str(@i + 1)) +
                   ' WHEN 1 THEN ''Ett'' WHEN 2 THEN ''Två''' +
                   ' WHEN 3 THEN ''Tre'' WHEN 4 THEN ''Fyra''' +
                   ' WHEN 5 THEN ''Fem'' WHEN 6 THEN ''Sex''' +
                   ' WHEN 7 THEN ''Sju'' WHEN 8 THEN ''Åtta''' +
                   ' WHEN 9 THEN ''Nio'' WHEN 10 THEN ''Tio'' END' +
                   ' WHERE a = ' + ltrim(str(@i + 1))
     SELECT @cmd = 'sqlcmd -S ' + @@servername + ' -d ' + db_name() +
                   ' -Q "' + @sql + '"'
     EXEC master..xp_cmdshell @cmd, 'no_output'
     RETURN (SELECT b FROM rsci WHERE a = @i)
  END
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用存储过程,而不是函数。SQL Server 中的函数与 OO 语言中的方法不同——它只是将数据返回给调用者。 (5认同)