?
Solved

Variable declaration in EXEC

Posted on 2001-06-22
10
Medium Priority
?
639 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 200 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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Fill in the form and get your FREE NFR key NOW!

Veeam is happy to provide a FREE NFR server license to certified engineers, trainers, and bloggers.  It allows for the non‑production use of Veeam Agent for Microsoft Windows. This license is valid for five workstations and two servers.

Question has a verified solution.

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

In the first part of this tutorial we will cover the prerequisites for installing SQL Server vNext on Linux.
This shares a stored procedure to retrieve permissions for a given user on the current database or across all databases on a server.
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.
Viewers will learn how to use the UPDATE and DELETE statements to change or remove existing data from their tables. Make a table: Update a specific column given a specific row using the UPDATE statement: Remove a set of values using the DELETE s…
Suggested Courses

807 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