Solved

Variable declaration in EXEC

Posted on 2001-06-22
10
629 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Salesforce Has Never Been Easier

Improve and reinforce salesforce training & adoption using WalkMe's digital adoption platform. Start saving on costly employee training by creating fast intuitive Walk-Thrus for Salesforce. Claim your Free Account Now

 
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
 
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

Simplifying Server Workload Migrations

This use case outlines the migration challenges that organizations face and how the Acronis AnyData Engine supports physical-to-physical (P2P), physical-to-virtual (P2V), virtual to physical (V2P), and cross-virtual (V2V) migration scenarios to address these challenges.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Everyone has problem when going to load data into Data warehouse (EDW). They all need to confirm that data quality is good but they don't no how to proceed. Microsoft has provided new task within SSIS 2008 called "Data Profiler Task". It solve th…
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…
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

690 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