[AccessD] Recompiling a stored procedure

David Emerson newsgrps at dalyn.co.nz
Wed May 19 22:42:06 CDT 2021


Hi Listers,

I have a strange situation which I think is linked to optimisation by SQL
Server.

I have a stored procedure which creates a temporary table.  The columns are
created based on the values of another table.  The stored procedure works
fine unless the there is little difference between the table when the code
was previously run and the current run.

For example, if the first run produces a table with these columns:	Yr
Age	Cash
And the send run produces a table with these columns:			Yr
Age	Cash	Roth	Pension
Then the second table has the correct column headings.

However, if the first run produces a table with these columns: 		Yr
Age	Cash	Roth	Pension
And the send run should produce a table with these columns:		Yr
Age	Cash	Roth	Retirement
Then the final table has the same column headings as the first.

The code is picking up the correct data for the headings and is initially
creating the correct headings but when the table has finished being created
the headings are the same as the previous run.

I have put debugging statements in the code and identified where the change
happens:

DECLARE @ttmpBWSCapitalAccount table(CapAccID int, Type smallint NULL
DEFAULT (0), Owner varchar (100) NULL, FBOwner smallint NULL DEFAULT (0),
	Purpose varchar (100) NULL, Year smallint DEFAULT (0), AccStart
money DEFAULT (0), Age smallint NULL DEFAULT (0), AgeSp smallint DEFAULT
(0),
	GoalAmt money DEFAULT (0), Savings money DEFAULT (0), AnnualReturn
real NULL DEFAULT (0), Growth money DEFAULT (0), AccEnd money DEFAULT (0),
	CostBasisBeforeGoals money DEFAULT (0), CostBasis money NULL DEFAULT
(0), AssocComp smallint DEFAULT (3), DispPreference smallint NULL DEFAULT
(50),
	ReqMinDist money DEFAULT (0), ClientAgeAvail smallint DEFAULT (0),
TaxRateLTCG real NULL DEFAULT (0) )

INSERT INTO @ttmpBWSCapitalAccount
SELECT * FROM dbo.fnGetttmpBWSCapitalAccount(@BWSClientID, @txtAnalysisYrs,
@ClientAgeCalc, @SpouseAgeCalc)

/* Generate a new crosstab table */ 
CREATE TABLE #ttmpBWSAccSummary (Yr int, ClSpAge Varchar(10))

DECLARE @Yr int, @Purpose varchar (100), @DispPreference smallint, @col
nvarchar(100), @strsql nvarchar(4000)

DECLARE cc CURSOR
FOR SELECT DISTINCT Purpose, DispPreference 
FROM  @ttmpBWSCapitalAccount
ORDER BY DispPreference

OPEN cc
FETCH NEXT FROM cc INTO @Purpose, @DispPreference
WHILE @@fetch_status=0
	BEGIN
		SELECT @col = @Purpose 
		/*Alter Table #ttmpBWSAccSummary add @col  money */
		SELECT @strsql = 'Alter table #ttmpBWSAccSummary add [' +
@col + '] money'
		EXEC (@strsql)
		FETCH NEXT FROM cc INTO @Purpose, @DispPreference
--Next line shows correct column headings for the second run:	Yr	Age
Cash	Roth	Retirement
SELECT @Purpose, * FROM #ttmpBWSAccSummary
	END
--Reverts to old value here:					Yr	Age
Cash	Roth	Pension
SELECT * FROM #ttmpBWSAccSummary
CLOSE cc
DEALLOCATE cc

I have made comments in the last 7 lines above which shows where the problem
hits.

I have found that if I run the sproc with the WITH RECOMPILE command that
the problem is solved:

Eg exec dbo.rptSpBWSoAccSummary 21640, 67, 33, 0 WITH RECOMPILE

However, this project is being run in Visual Studio it will take me some
effort to arrange the changing of that code (it is not something I have much
control over).

Is there some way to force a recompile within a stored procedure?

Regards

David Emerson
Dalyn Software Ltd
Wellington, New Zealand

 





More information about the AccessD mailing list