patternsqlModerate
Invalid use of a side-effecting operator 'INSERT' within a function - Multiple Inserts in Function
Viewed 0 times
insertoperatorinsertssidefunctionwithinmultipleeffectinginvaliduse
Problem
If this is not the right forum please let me know and move it for me.
I've just got a bunch of inserts like this toward the end of my scalar function:
I've just got a bunch of inserts like this toward the end of my scalar function:
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(3
,@NewUserID)
INSERT INTO [Raptor].[dbo].[UserRole]
([RoleId]
,[UserId])
VALUES
(5
,@NewUserID)Solution
In T-SQL, you cannot modify any data in a function. There is no straightforward way around it. There are some obscure hacks, but I would not use them. Use a stored procedure.
The hack, quoting from Erland Sommarskog:
The hack, quoting from 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)
ENDCode Snippets
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)
ENDContext
StackExchange Database Administrators Q#12585, answer score: 11
Revisions (0)
No revisions yet.