Solved

im trying to create a user defined function, but cant execute it as an error message appears

Posted on 2008-10-28
6
271 Views
Last Modified: 2008-11-28
when trying to run an sql 2005 user defined function, it wont execute as the following error message occurs:

Msg 443, Level 16, State 15, Procedure InsertMailingPreferences, Line 60
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function.

How do i resolve this?

THanks

Julia
USE [MembershipDB]

GO

/****** Object:  UserDefinedFunction [dbo].[getUpgradeProductIdInPackage]    Script Date: 10/27/2008 14:09:44 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

create FUNCTION [dbo].[InsertMailingPreferences] (

			

			@PackageID int,

			@AddressID int,

			@UserName nvarchar(100)

								

			)

returns nvarchar(50)--int	

as

BEGIN
 
 

DECLARE @Counter int

SET @Counter = 0
 

DECLARE @TotalRows int

DECLARE @ServiceID int

DECLARE @MailingMethodID int

DECLARE @MaxServiceID int

DECLARE @NowDate datetime

--------------------------------------------------------------

DECLARE @DefaultMailingsTable	table

(

		ServiceID int,

		ServiceName nvarchar(50),

		DefaultMailingMethodID int,

		MethodDesc nvarchar(50)

		)
 
 

--SET @DefaultMailingsTable = dbo.getDefaultMailingPreferencesForPackage(@PackageID)

--SET @DefaultMailingsTable = (SELECT * FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID))
 

Insert Into @DefaultMailingsTable

SELECT * FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID)
 

SET @TotalRows = (SELECT Count(*) FROM @DefaultMailingsTable)

SET @MaxServiceID = (SELECT Max (ServiceID) FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID))
 
 

WHILE (@Counter < @MaxServiceID+1)

BEGIN
 

--Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE   exists

--		(Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)
 

	If  (Select ServiceID FROM @DefaultMailingsTable WHERE   serviceID in  (@Counter)) is NOT null

		--(Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)) = @Counter -- is not null
 

	BEGIN

	Set @ServiceID = (Select ServiceID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)

	Set @MailingMethodID = (Select  DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)

	Set @NowDate = getDate()

--convert(datetime,getDate(),103)
 
 
 
 

	

	INSERT INTO dbo.MailingUserPreferences(UserName, DateSelected, MailingMethodID, AddressID, ServiceID)

	VALUES(@UserName, convert(datetime,24/05/2008,103),  1, @AddressID, @ServiceID);

	SET @Counter = @Counter + 1	

	END
 

	Else 
 

	Begin

	SET @Counter = @Counter + 1	

	end
 
 
 
 

END
 
 
 
 

Return 'Success'

--Return @PackageID
 
 
 
 

END

Open in new window

0
Comment
Question by:Juliafrazer
  • 2
6 Comments
 
LVL 60

Accepted Solution

by:
chapmandew earned 250 total points
ID: 22824681
You can't run DML statements on user tables inside functions like that.
0
 
LVL 39

Assisted Solution

by:BrandonGalderisi
BrandonGalderisi earned 250 total points
ID: 22824747
Chap is right... but what you really want is a stored procedure.
USE [MembershipDB]

GO

/****** Object:  procedure[dbo].[getUpgradeProductIdInPackage]    Script Date: 10/27/2008 14:09:44 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

create procedure [dbo].[InsertMailingPreferences] 

                        

                        @PackageID int,

                        @AddressID int,

                        @UserName nvarchar(100)

                        @output nvarchar(50) output                                        

as

BEGIN

 

 

DECLARE @Counter int

SET @Counter = 0

 

DECLARE @TotalRows int

DECLARE @ServiceID int

DECLARE @MailingMethodID int

DECLARE @MaxServiceID int

DECLARE @NowDate datetime

--------------------------------------------------------------

DECLARE @DefaultMailingsTable   table

(

                ServiceID int,

                ServiceName nvarchar(50),

                DefaultMailingMethodID int,

                MethodDesc nvarchar(50)

                )

 

 

--SET @DefaultMailingsTable = dbo.getDefaultMailingPreferencesForPackage(@PackageID)

--SET @DefaultMailingsTable = (SELECT * FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID))

 

Insert Into @DefaultMailingsTable

SELECT * FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID)

 

SET @TotalRows = (SELECT Count(*) FROM @DefaultMailingsTable)

SET @MaxServiceID = (SELECT Max (ServiceID) FROM dbo.getDefaultMailingPreferencesForPackage(@PackageID))

 

 

WHILE (@Counter < @MaxServiceID+1)

BEGIN

 

--Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE   exists

--              (Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)

 

        If  (Select ServiceID FROM @DefaultMailingsTable WHERE   serviceID in  (@Counter)) is NOT null

                --(Select ServiceID, DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)) = @Counter -- is not null

 

        BEGIN

        Set @ServiceID = (Select ServiceID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)

        Set @MailingMethodID = (Select  DefaultMailingMethodID FROM @DefaultMailingsTable WHERE ServiceID = @Counter)

        Set @NowDate = getDate()

--convert(datetime,getDate(),103)

 

 

 

 

        

        INSERT INTO dbo.MailingUserPreferences(UserName, DateSelected, MailingMethodID, AddressID, ServiceID)

        VALUES(@UserName, convert(datetime,24/05/2008,103),  1, @AddressID, @ServiceID);

        SET @Counter = @Counter + 1     

        END

 

        Else 

 

        Begin

        SET @Counter = @Counter + 1     

        end

 

 

 

 

END

 

 

 

 

set @Output= 'Success'   -- to set the output parameter

print @Output            -- to print it to screen

--Return @PackageID

 

 

 

 

END

Open in new window

0
 

Author Comment

by:Juliafrazer
ID: 22830179
Thanks,

but this function is the second call, after a stored procedure, which then calls another function as you can see.

The problem is, when i convert the above function to a strored procecure, i cant call it from another stored procedure...or can i?

Thanks

Julia
0
 
LVL 60

Expert Comment

by:chapmandew
ID: 22830303
absolutely....you can call another proc from one proc


create proc allprocs
as
exec proc1
exec proc2
exec proc3
0

Featured Post

Get up to 2TB FREE CLOUD per backup license!

An exclusive Black Friday offer just for Expert Exchange audience! Buy any of our top-rated backup solutions & get up to 2TB free cloud per system! Perform local & cloud backup in the same step, and restore instantly—anytime, anywhere. Grab this deal now before it disappears!

Join & Write a Comment

I am showing a way to read/import the excel data in table using SQL server 2005... Suppose there is an Excel file "Book1" at location "C:\temp" with column "First Name" and "Last Name". Now to import this Excel data into the table, we will use…
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now