June 10, 2005 at 1:43 pm
'SELECT MAX(ID1) FROM (SELECT TOP '+ CAST(@grade1 as varchar)+ ' * FROM table1
WHERE device_date> CAST('''+CAST(@device_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY device_date) a'
I want to select the result of the above query into a variable
@no1 of datatype int
How can I do that. I tried the following statement and its not working for me.
'SELECT @no1=MAX(ID1) FROM (SELECT TOP '+ CAST(@grade1 as varchar)+ ' * FROM table1
WHERE device_date> CAST('''+CAST(@device_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY device_date) a'
Any Iddeas would be greately appreciated.
Thanks.
June 10, 2005 at 2:01 pm
Do you need to select the max id from a dynamic sampling of the table?
June 10, 2005 at 2:08 pm
I have had similar problems. You could put it into a #TempTable or @TableVariable and use sp_executesql. The problem often lies in the new SPID that is created when Dynamic SQL is used...
I wasn't born stupid - I had to study.
June 10, 2005 at 2:15 pm
There's no need for dynamic sql in this situation... I'm just waiting for the answer to demonstrate .
June 10, 2005 at 2:30 pm
yes ,I need to select the result(max(id)) into a variable. Also I have one more dynamic sql which returns onother value. So I am selecting these two results into two local variables and then comparing these two variables and then depending on the conditions I will do some DMLs on the table.
June 10, 2005 at 2:35 pm
can you post the whole proc... maybe we can simplify it somehow.
June 10, 2005 at 2:49 pm
DROP TABLE #temp
DECLARE @university_id varchar(8),
@college_id varchar(8),
@department_id varchar(4),
@status varchar(20),
@high_mark int,
@low_mark int,
@exam_date datetime,
@sqlselect1 varchar(1000),
@Sqlselect2 varchar(1000),
@id1 int,
@id2 int
SELECT IDENTITY (int,1,1) AS id1,a.university_id,a.college_id,a.department_id,a.exam_date, 'Status'=
CASE WHEN electric_power >b.grade_level2 then 'pass'
WHEN electric_power <b.grade_level1 then 'fail'
END,electric_power,grade_level2,grade_level1
INTO #temp
FROM spr_real_time_data a INNER JOIN spr_department b
ON a.university_id=b.university_id AND a.college_id=b.college_id AND a.department_id=b.department_id
WHERE a.department_id='1805' AND exam_date CAST('''+CAST(@exam_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY exam_date ) a1
WHERE id1+1 NOT IN(SELECT ID1 FROM (SELECT TOP '+ CAST(@high_mark as varchar)+ '
* FROM #temp WHERE exam_date> CAST('''+CAST(@exam_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY exam_date )a)'
EXEC (@Sqlselect1)
SELECT @sqlselect2='SELECT MAX(ID1) FROM (SELECT TOP '+ CAST(@high_mark as varchar)+ ' * FROM #temp
WHERE exam_date> CAST('''+CAST(@exam_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY exam_date) a'
SELECT @sqlselect2 as sqlstmt1
EXEC (@sqlselect2)
IF @id1<=@id2
BEGIN
INSERT INTO spr_grade_log(department_id,college_id,university_id,grade_condition,grade_time)
VALUES(@department_id,@college_id,@university_id,@status,@exam_date)
END
---------------------------------
END
FETCH NEXT FROM gradeCur
INTO @university_id,@college_id,@department_id,@high_mark,@low_mark,@status,@exam_date
END
DEALLOCATE gradeCur
GO
I was talking abt the dotted part. And sorry for not commenting the proc.
Thanks.
June 10, 2005 at 2:52 pm
Can you describe what's this supposed to do...
I'll check your answer before I got to bed (6-7 hours)
June 10, 2005 at 3:07 pm
HI Remi,
WE are collecting the department info.
Every department was set two electric power levels one High and the other low. Suppose if The electric power is beyond the higher level and it would be considered as 'pass' and if the electric power is below the lower level it should be considered as 'fail'.
Suppose if it became pass on day9, we should check status for the next 5 days and if its pass during the next 5 days it should be passed otherwise we dont mark anything on that. same with failure.. We need to check five consecutive days.
The description might be confusing coz i wrote this in a hurry.. I would I appreciate if u can help me in optimizing code. Before that can u let me know how to select the result into a variable
in the dynamic sql.
Thanks.
June 10, 2005 at 7:55 pm
This is way more complexe than I expected... Will talk to you again on Monday (when I have access to a server).
June 10, 2005 at 8:50 pm
Here's a quick and dirty example of how to select the result of dynamic sql into a variable. You need to wrap the sql statement in a temporary stored procedure with an output parameter. The reason this works is that the temporary stored procedure is local to the connection, not the batch like the sql statement in EXEC (@sql). You can also call EXEC sp_executesql (see KB262499).
DECLARE @S1 VARCHAR(8000)
SET @S1 = 'CREATE PROCEDURE #T1 (@V1 DATETIME OUTPUT) AS SELECT @V1 = GETDATE()'
EXEC (@S1)
DECLARE @V1 DATETIME EXEC #T1 @V1 OUTPUT SELECT @V1
DROP PROCEDURE #T1
GO
I verified that this technique also works within another procedure:
CREATE PROCEDURE #T2 AS
DECLARE @S1 VARCHAR(8000)
SET @S1 = 'CREATE PROCEDURE #T1 (@V1 DATETIME OUTPUT) AS SELECT @V1 = GETDATE()'
EXEC (@S1)
DECLARE @V1 DATETIME EXEC #T1 @V1 OUTPUT SELECT @V1
DROP PROCEDURE #T1
GO
EXEC #T2
GO
DROP PROCEDURE #T2
GO
Brian
MCDBA, MCSE+I, Master CNE
June 10, 2005 at 9:50 pm
Someone mentioned using a temp table, but didn't give an example.
use Northwind
declare @i int,@sql nvarchar(2000)
create table #tmp (i int)
set @i=-1
set @sql = 'declare @i int
SELECT @i=MAX(CategoryID) FROM dbo.Categories
where CategoryID in (SELECT TOP 5 CategoryID FROM dbo.Categories)
insert into #tmp (i) select @i'
exec (@sql)
SELECT @i= i from #tmp
print 'test ' + cast(@i as varchar)
drop table #tmp
June 10, 2005 at 10:06 pm
Looks like I've got imbedding a variable into the script on the brain. Here is a different example with a more complex selection logic, but no variables.
use Northwind
declare @i int,@sql varchar(2000)
create table #tmp (i int)
set @i=-1
set @sql = 'insert into #tmp (i)
SELECT MAX(CategoryID) FROM dbo.Categories
where CategoryID in
(SELECT TOP 3 CategoryID FROM dbo.Categories
where CategoryName like ''%o%''
order by CategoryName desc)'
exec (@sql)
SELECT @i= i from #tmp
print 'test ' + cast(@i as varchar)
drop table #tmp
August 31, 2005 at 8:29 pm
-- I hope this demonstrates a relatively simple method
declare @id1 int
create table #result (id1 int)
set @sql = 'SELECT MAX(ID1) FROM (SELECT TOP '+ CAST(@grade1 as varchar)+ ' * FROM table1
WHERE device_date> CAST('''+CAST(@device_date as varchar)+ ''' AS datetime)
AND university_id= '''+ @university_id+''' AND college_id= '''+@college_id +'''
AND department_id= '''+@department_id+'''ORDER BY device_date) a'
insert into #result (id1)
exec (@sql)
select @id1 = id1
from #result
select @id1
September 1, 2005 at 4:12 am
Hi Sahana,
In your original post you asked about selecting the result of a dynamic query into a variable. Here is an example using sp_executesql
DECLARE @no1 INT
SET @sql = N'SET @no1 = (SELECT something FROM table)'
EXEC sp_executesql @sql, N'@no1 INT OUTPUT', @no1 OUTPUT
Assuming the sql in your original post is correct and returns the value you require, something along these lines should return your value from dynamic sql:-
DECLARE @sql NVARCHAR(4000)
DECLARE @no1 INT
SET @sql = N'SET @no1 = (SELECT MAX(ID1) FROM (SELECT TOP '+ CAST(@grade1 AS VARCHAR(50)) + ' * FROM table1 WHERE device_date> CAST(''' + CAST(@device_date AS VARCHAR(50)) + ''' AS datetime) AND university_id= ' + CAST(@university_id AS VARCHAR(50)) + ' AND college_id= ' + CAST(@college_id AS VARCHAR(50)) + ' AND department_id= ' + cast(@department_id AS VARCHAR(50)) + ' ORDER BY device_date))'
EXEC sp_executesql @sql, N'@no1 INT OUTPUT', @no1 OUTPUT
You do really need to understand Dynamic SQL before deciding to use it in anger. Read http://www.sommarskog.se/dynamic_sql.html and do some research.
I do believe Remi will give you a much better set based solution if you give him the time.
Sorry Remi - just answering the original question.......
Have fun
Steve
We need men who can dream of things that never were.
Viewing 15 posts - 1 through 15 (of 15 total)
You must be logged in to reply to this topic. Login to reply