Error converting query to inline function

I have a query that I need to convert to a function.  The query will return the desired table.
When I try to save the function I get the errors:
Incorrect syntax near the keyword 'Declare'.
Incorrect syntax near 'Returns'.
Must declare the scalar variable "@Cols".
Must declare the scalar variable "@Cols".
Incorrect syntax near 'end'

Any help will be appreciated
CREATE FUNCTION dbo.TaskStatusPivot
 
Declare @strSQL varchar(max)
DECLARE @cols varchar(2000)
 
RETURNS TABLE
AS
	RETURN 
	SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + task
                        FROM    WeekTaskStatus
                        ORDER BY '],[' + task
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'
 
 
set @strSQL = 'select WeekEnd, ' + @cols +
		' from (
			select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
		  pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
exec(@strSQL) 
 
end

Open in new window

LVL 1
ScamquistAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Guy Hengel [angelIII / a3]Billing EngineerCommented:
functions cannot have dynamic sql.
you will need to stick with a stored procedure or some other method.
0
pssandhuCommented:
You do not use Decalre keyword when settnig parameters. Try this:
CREATE FUNCTION dbo.TaskStatusPivot (@strSQL varchar(max),@cols varchar(2000))
 
RETURNS TABLE
AS
BEGIN	
	SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + task
                        FROM    WeekTaskStatus
                        ORDER BY '],[' + task
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'
 
 
set @strSQL = 'select WeekEnd, ' + @cols +
		' from (
			select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
		  pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
RETURN exec(@strSQL) 
 
end

Open in new window

0
Aneesh RetnakaranDatabase AdministratorCommented:
You cannot run dynamic sql within a function, you should change this to a stored proc
0
10 Tips to Protect Your Business from Ransomware

Did you know that ransomware is the most widespread, destructive malware in the world today? It accounts for 39% of all security breaches, with ransomware gangsters projected to make $11.5B in profits from online extortion by 2019.

pssandhuCommented:
Errr.. correct need to change the dynamic sql too
0
ScamquistAuthor Commented:
I tried the code below.
I now get the error:

Incorrect syntax near the word 'Declare'.
CREATE PROCEDURE dbo.TaskStatusPivot
 
Declare @strSQL varchar(max)
DECLARE @cols varchar(2000)
 
 
	RETURN
	SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + task
                        FROM    WeekTaskStatus
                        ORDER BY '],[' + task
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'
 
 
set @strSQL = 'select WeekEnd, ' + @cols +
		' from (
			select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
		  pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
exec(@strSQL)

Open in new window

0
RiteshShahCommented:
>>You do not use Decalre keyword when settnig parameters. Try this:<<

will this change work? ;)
0
RiteshShahCommented:
I also suggest to use Stored procedure as dynamic SQL is not permitted in function.
0
ScamquistAuthor Commented:
RiteshShah
Try what?

Replace
Declare @strSQL varchar(max)
DECLARE @cols varchar(2000)
with
(@strSQL varchar(max),@cols varchar(2000))

I am not sure what you mean by:
>>You do not use Decalre keyword when settnig parameters. Try this:<<
0
RiteshShahCommented:
I was asking to pssandhu as he said to change something and which suppose to work in function.

For you, all I can say is, your function will not work at all if it has dynamic SQL
0
ScamquistAuthor Commented:
I did deleted the function attempt and tried to create a Stored Procedure.

When I tried the Stored Procedure in the attached code, I got the error:

Incorrect syntax near the word 'Declare'.
CREATE PROCEDURE dbo.TaskStatusPivot
 
Declare @strSQL varchar(max)
DECLARE @cols varchar(2000)
 
 
	RETURN
	SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + task
                        FROM    WeekTaskStatus
                        ORDER BY '],[' + task
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'
 
 
set @strSQL = 'select WeekEnd, ' + @cols +
		' from (
			select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
		  pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
exec(@strSQL)
 

Open in new window

0
RiteshShahCommented:
try this:



CREATE PROCEDURE dbo.TaskStatusPivot
as
declare @strSQL varchar(max)
declare @cols varchar(2000)
 
        SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + task
                        FROM    WeekTaskStatus
                        ORDER BY '],[' + task
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'
 
 
set @strSQL = 'select WeekEnd, ' + @cols +
                ' from (
                        select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
                  pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
exec(@strSQL)

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Aneesh RetnakaranDatabase AdministratorCommented:
CREATE PROCEDURE dbo.TaskStatusPivot
as
 
Declare @strSQL varchar(max)
DECLARE @cols varchar(2000)
SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                            '],[' + task
                    FROM    WeekTaskStatus
                    ORDER BY '],[' + task
                    FOR XML PATH('')
                  ), 1, 2, '') + ']'

 
set @strSQL = 'select WeekEnd, ' + @cols +
            ' from (
                  select WeekEnd, Task, TaskStatus from WeekTaskStatus) o
              pivot (Max(TaskStatus) for Task in (' + @cols + ')) p'
 
exec(@strSQL)
 
0
pssandhuCommented:
Ritesh, I did not know you were aking me? lol. No, I corrected my self in the following post saying that he need to change the dynamic SQL after I saw angel's post since I didn't realise he was using dynamic SQL. His first error was "Incorrect syntax near DECLARE" so when I looked at his code, the decalre statements were between the CREATE FUNCTION statement and "RETURNS TABLE" statement I thought he is trying to set up parameters since you do not declare variables there.
Anyway, should have read through till the end. At work so trying take as much less time as possible answering.
P.
0
RiteshShahCommented:
no problem, it happens sometime, I don't have .00001% doubts about your skill :) me either have to read full post ;)
0
ScamquistAuthor Commented:
The code saved.  
I have been trying to get this pivot statement to create a table when called.  

I am not sure of the protocol.  Do I need to create a new ee question ...or someone help with this?
0
pssandhuCommented:
Hey Ritesh, it's all good man, I didn't mind considering I am the new kid on the block and still learning the art of answering effectively. ;-)
Scamquist, I think you should split points between Aneesh and Ritesh and open a new question.
P.
0
ScamquistAuthor Commented:
pssandhu:  -  WILL DO.  Thanks all
0
ScamquistAuthor Commented:
I need to study what you did.  I have been trying for a few days to get a dynamic pivot query to work.  When I got the query to work, it wouldn't save.  The stored procedure was the next hurdle. I appreciate the help.
I will be posting a follow up question to get the stored prodcedure to create a table when called.  Thank you both for the assist
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft SQL Server 2008

From novice to tech pro — start learning today.