1

sql server 2012

i have created a SP to create view dynamically with Parameter i supplied.

below is the code

i am not sure why i am getting the below error.

Msg 102, Level 15, State 1, Procedure uspCreateView, Line 10 Incorrect syntax near '@VIEWNM'.

Code:

CREATE PROCEDURE uspCreateView
@VIEWNM VARCHAR(50),
@COMP INT,
@TODT DATE = 9999-12-31


    AS
    EXEC ('

    CREATE VIEW +'@VIEWNM'
    AS
(
SELECT
COL1,
COL2,
COL3,   
DATE,   
SKU,    
CASE WHEN IsRowCurrent = 1 THEN '@TODT' ELSE dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT), FMDT) END AS TODT,

FROM MYTABLE mt


OUTER APPLY (   SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE 
                        FROM    MYTABLE mt2 
                        WHERE   mt2.COL1 = mt.COL1 
                                AND mt2.COL2 = mt.COL2 
                                AND mt2.FMDT > mt.FMDT
                                AND mt.COL3 = '@COMPID'  ) oa
  WHERE mt.COL3 = '@COMPID'
  )  

please help me to fix the below error. Thanks

2
  • You should probably use a function instead of a stored procedure and view and write select * from myFunction(@TODT,@COMPID) Commented Mar 12, 2018 at 9:04
  • BTW the culture invariant date format is YYYYMMDD. YYYY-MM-DD is affected by the DATEFORMAT parameter and could be interpreted as YYYY-DD-MM if DATEFORMAT is set to MDY Commented Mar 12, 2018 at 9:06

3 Answers 3

2

I am not sure, why you want to create views dynamically, ideally views should be created before hand only, and you will be required to fetch the data depending on the condition.

Still if you want to proceed, you should do it proper way to avoid any issues. I can see there are issues with your implementation. Ideally you should make it parameterized, like following sample query to avoid any SQL injection.

There are issues with your provided code also, I tried to fix some of these.

CREATE PROCEDURE uspCreateView 
    (
      @VIEWNM      VARCHAR(50), 
      @COMP        INT, 
      @TODT        DATE = '9999-12-31' 
      )
    AS
    BEGIN
     DECLARE @Query NVARCHAR(MAX) 
     DECLARE @ParmDefinition nvarchar(MAX);  
    SET @Query = N'CREATE VIEW @VIEWNM_I     AS ( SELECT COL1, COL2, COL3, DATE, SKU, 
        CASE WHEN IsRowCurrent = 1 THEN @TODT_I ELSE 
        dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT)
        , FMDT) END AS TODT, FROM MYTABLE mt OUTER APPLY (   
        SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE                         
        FROM    MYTABLE mt2                         
        WHERE   mt2.COL1 = mt.COL1                                 
        AND mt2.COL2 = mt.COL2                                 
        AND mt2.FMDT > mt.FMDT                                 
        AND mt.COL3 = @COMPID_I  ) oa  
        WHERE mt.COL3 = @COMPID_I)' 
    SET @ParmDefinition = N'@VIEWNM VARCHAR(100),@TODT_I DATETIME,@COMP_I INT';  
    EXECUTE sp_executesql @Query,@ParmDefinition, @VIEWNM_I=@VIEWNM,  @COMP_I=@COMP, @TODT_I=@TODT
    END
Sign up to request clarification or add additional context in comments.

Comments

0

Try this

Command(s) completed successfully.

CREATE PROCEDURE uspCreateView
@VIEWNM VARCHAR(50),
@COMP INT,
@TODT DATE = '9999-12-31'


    AS
    EXEC ('

    CREATE VIEW '+@VIEWNM+'
    AS
(
SELECT
COL1,
COL2,
COL3,   
DATE,   
SKU,    
CASE WHEN IsRowCurrent = 1 THEN '+@TODT+' ELSE dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT), FMDT) END AS TODT,

FROM MYTABLE mt


OUTER APPLY (   SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE 
                        FROM    MYTABLE mt2 
                        WHERE   mt2.COL1 = mt.COL1 
                                AND mt2.COL2 = mt.COL2 
                                AND mt2.FMDT > mt.FMDT
                                AND mt.COL3 = '+@COMP+'  ) oa
  WHERE mt.COL3 = '+@COMP+'
  )  ')

3 Comments

Thanks a lot but why i am getting error when excuting EXEC uspCreateView VIEWNM = 'vw_test' COMP= 9999 TODT= '9999-12-31'. Error message: Incorrect syntax near '@COMP'.
wait i check store procedure.
Thanks Ravi for your help
0

It should be
CREATE VIEW ' + @VIEWNM + ' AS...

3 Comments

but when i am trying to execute like EXEC uspCreateView VIEWNM = 'vwtest', COMPID=9999,TODT=''. i am getting error like Incorrect syntax near '9999'.. Please help
Thank You Very Much Aswani, Please help me how to do print meassage
Declare a variable and assign the dynamic query to that variable.Print that

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.