Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 508
  • Last Modified:

Convert simple query to dyanmic SQL - results to table variable/temp table

OK - I have the below query - need to convert it into dynamic SQL with the @datStart and @datStop date time params as dynamic variables - also need to take the results and put them into a table variable or a temp table to be used later on in the sproc - any help would be greatly appreciated!
SELECT @datStart, @datStop
-- DROP TABLE #TEMP_ACCT DROP TABLE #TEMP_AVG
SELECT DISTINCT ACCT_NO INTO #TEMP_ACCT FROM data8.dbStPetes.dbo.tblHEAD
WHERE (ISNULL(DISCHARGE,ADMIT) >= @datStart) AND (ISNULL(DISCHARGE,ADMIT) <= @datStop)
 
SELECT DISTINCT DEPT_CODE, PROC_CODE,
      CASE WHEN ISNULL(SUM(QTY),0) = 0 OR ISNULL(SUM(REV),0) =0 THEN 0
            ELSE SUM(REV)/SUM(QTY)
            END AS AVGREV 
INTO #TEMP_AVG
FROM data8.dbStPetes.dbo.tblTRANS
WHERE ACCT_NO IN(SELECT ACCT_NO FROM #TEMP_ACCT)
GROUP BY DEPT_CODE, PROC_CODE

Open in new window

0
tbaseflug
Asked:
tbaseflug
1 Solution
 
chapmandewCommented:
ummm...not sure what you mean.  Ifyou just want to use params, then you don't need to use dynamic sql
0
 
bljakCommented:
I do not quite understand what is your question here.
Except that @datStart and @datStop should be stored procedure parameters your query is already dynamic and is having result in the temp table for later use.
0
 
tbaseflugAuthor Commented:
Well - the database name is ultimately going to be a param as well - that I know how to do but am horrible at getting the dates to work and in getting the results out of the dynamic query
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
Aneesh RetnakaranDatabase AdministratorCommented:
Hello tbaseflug,


DECLARE @dbName nvarchar(100) ,@datStart datetime , @datStop datetime
SELECT @dbName ='data8'
SELECT @datStart = '2008-01-01' , @datStop = '2009-01-01'
-- DROP TABLE #TEMP_ACCT DROP TABLE #TEMP_AVG
CREATE TABLE #TEMP_AVG (DEPT_CODE int , PROC_CODE int, AVGREV int )
DECLARE @nSql nvarchar(1000)
SELECT @nSql = ' SELECT DISTINCT ACCT_NO FROM ' +@dbName+ '.dbStPetes.dbo.tblHEAD
WHERE (ISNULL(DISCHARGE,ADMIT) >= @datStart) AND (ISNULL(DISCHARGE,ADMIT) <= @datStop)'

SELECT @nSql = 'SELECT DISTINCT DEPT_CODE, PROC_CODE,
      CASE WHEN ISNULL(SUM(QTY),0) = 0 OR ISNULL(SUM(REV),0) =0 THEN 0
            ELSE SUM(REV)/SUM(QTY)
            END AS AVGREV
FROM '+@dbName+'.dbStPetes.dbo.tblTRANS
WHERE ACCT_NO IN('+@nSql + ')
GROUP BY DEPT_CODE, PROC_CODE'

INSERT INTO #TEMP_AVG
exec sp_ExecuteSQL @nSql, '@datStart datetime, @datStop datetime ', @datStart, @datStop
 

Regards,

Aneesh
0
 
tbaseflugAuthor Commented:
OK - I took the above and plugged it in but am getting the following error:
(1 row(s) affected)
Msg 214, Level 16, State 3, Procedure sp_executesql, Line 1
Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'.

DECLARE @dbName nvarchar(100) ,@datStart datetime , @datStop datetime, @cdmDate datetime 
SET @dbName = 'dbStPetes'
SET @cdmDate = '11/15/2006'
 
DECLARE @dateTable TABLE 
(
  cdmType varchar(50), cdmDesc varchar(100), qtyDateFrom datetime,  qtyDateThru datetime,  priorDate datetime
)
 
INSERT INTO @dateTable
EXEC dbo.spWebCDMEditor_GetCDMInfo @dbName, @cdmDate
 
SET @datStart = (SELECT qtyDateFrom FROM @dateTable)  -- begin discharge date
SET @datStop = (SELECT qtyDateThru FROM @dateTable)   -- end discharge date
 
-- DROP TABLE #TEMP_ACCT DROP TABLE #TEMP_AVG
CREATE TABLE #TEMP_AVG (DEPT_CODE int , PROC_CODE int, AVGREV int )
DECLARE @nSql nvarchar(1000) 
SELECT @nSql = ' SELECT DISTINCT ACCT_NO FROM data8.' +@dbName+ '.dbo.tblHEAD
WHERE (ISNULL(DISCHARGE,ADMIT) >= @datStart) AND (ISNULL(DISCHARGE,ADMIT) <= @datStop)' 
 
SELECT @nSql = 'SELECT DISTINCT DEPT_CODE, PROC_CODE,
      CASE WHEN ISNULL(SUM(QTY),0) = 0 OR ISNULL(SUM(REV),0) =0 THEN 0
            ELSE SUM(REV)/SUM(QTY)
            END AS AVGREV 
FROM data8.' +@dbName+ '.dbo.tblTRANS
WHERE ACCT_NO IN('+@nSql + ')
GROUP BY DEPT_CODE, PROC_CODE' 
 
INSERT INTO #TEMP_AVG
exec sp_ExecuteSQL @nSql, '@datStart datetime, @datStop datetime ', @datStart, @datStop

Open in new window

0
 
tbaseflugAuthor Commented:
this did it - just changed out end to: exec sp_ExecuteSQL @nSql, N'@datStart datetime, @datStop datetime ', @datStart, @datStop
0
 
Aneesh RetnakaranDatabase AdministratorCommented:
change the last two lines like this

INSERT INTO #TEMP_AVG
exec sp_ExecuteSQL @nSql, N'@datStart datetime, @datStop datetime ', @datStart, @datStop
0

Featured Post

Free recovery tool for Microsoft Active Directory

Veeam Explorer for Microsoft Active Directory provides fast and reliable object-level recovery for Active Directory from a single-pass, agentless backup or storage snapshot — without the need to restore an entire virtual machine or use third-party tools.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now