Solved

Variable declaration in EXEC

Posted on 2001-06-22
10
624 Views
Last Modified: 2008-02-26
Hi,

    I'm having a strange problem with a query that I hope someone may have seen before.  I've declared a variable @statvar as type int and @cmd1 as a varchar (255).

The statement where I'm having the problem is as follows:

set @cmd1='select @statvar=count(*) from '+@dbname+'..sysfiles'

exec(@cmd1)

I keep getting the error "Must declare the variable @statvar"

I've worked around the problem by eliminating the '@statvar= ' and sending the results to a temp table instead, but I'm curious as to why the original query doesn't work.  I don't have any 'go' statements prior to it.

Thanks in advance!
0
Comment
Question by:DecaysChampion
  • 2
  • 2
  • 2
  • +3
10 Comments
 
LVL 30

Accepted Solution

by:
SteveGTR earned 50 total points
ID: 6219361
Hi,

The @statvar is out of scope when you do exec. I've found success programming dynamic SQL statements using cursors:

exec("declare hC1 cursor GLOBAL READ_ONLY for " +
  "select count(*) from " + @dbname + "..sysfiles")

open hC1
fetch hC1 into @statvar
close hC1
deallocate hC1

Good Luck,
Steve
0
 
LVL 3

Expert Comment

by:mathavra
ID: 6219397
Try "select" instead of "set" as below:

select @cmd1='select @statvar=count(*)from '+@dbname+'..sysfiles'

Or

Is it OK for you move the declare statments just before the SQL statment as below:

declare @statvar int
select @cmd1='select @statvar=count(*)from '+@dbname+'..sysfiles'
0
 

Author Comment

by:DecaysChampion
ID: 6219431
Mathavra,

The problem occurs regardless of where the DECLARE statement is and I've verified that the actual command is being correctly stored in @cmd1 using SET (It occurs during the exec statement).
0
 
LVL 3

Expert Comment

by:mgmanoj
ID: 6219441
When you assign value to a variable inside the dynamic sql that variable is treated as local variable to that sql statement. When you execute a dynamic sql it treats that sql statement as new bunch of statement (what i understood might be it must be executing with new connection)
0
 

Expert Comment

by:CharlesM
ID: 6219479
mq is correct, it's seen as a local variable, ergo, this will work fine as @statvar is declared within the string:

set @cmd1='declare @statvar int; select @statvar=count(*)from '+@dbname+'..sysfiles; select @statvar;'
exec(@cmd1)
0
6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

 
LVL 30

Expert Comment

by:SteveGTR
ID: 6219503
You are correct Charles, but after the exec returns the @statvar will be unaccessible (out of scope).

My cursor example get's around this as does DecaysChampion's temp table solution.
0
 

Expert Comment

by:CharlesM
ID: 6219510
Proof of theory ;o)
0
 
LVL 3

Expert Comment

by:mathavra
ID: 6219748
Whatever I proposed did not work for me also. I just tried. Sorry for the incorrect answer.

I think, each EXEC statement is executed as a (separate) batch and that is reason why it is not recognizing the variable declaration. Also, it cannot return any variable since it is out of scope as mqmanoj.

May be you want to use stored procedure and return the appropriate value from the stored procedure.
0
 

Author Comment

by:DecaysChampion
ID: 6219827
Thank you all for your comments!
0
 
LVL 18

Expert Comment

by:nigelrivett
ID: 6220519
Sorry to be late but you can set return parameters from dynamic sql and dynamic sql SP calls if you use sp_executesql instead of exec.

You cannot set parameters from an exec but you can from sp_executesql.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

The Delta outage: 650 cancelled flights, more than 1200 delayed flights, thousands of frustrated customers, tens of millions of dollars in damages – plus untold reputational damage to one of the world’s most trusted airlines. All due to a catastroph…
For both online and offline retail, the cross-channel business is the most recent pattern in the B2C trade space.
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
Viewers will learn how the fundamental information of how to create a table.

708 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

20 Experts available now in Live!

Get 1:1 Help Now