执行动态 SQL

Execute Dynamic SQL

我正在使用动态 SQL 来执行查询。

为此我创建了这个存储过程:

CREATE PROCEDURE MySP    
(    
   @StateId CHAR(3),    
   @DeptId VARCHAR(15),    
   @Query NVARCHAR(MAX)    
)    
AS    
BEGIN   
  DECLARE @Where NVARCHAR(500);    
  DECLARE @FinalQuery NVARCHAR(MAX)='';    

  SET @Where=' where emppersonal.stateid=Cast('''+@StateId+''' AS INT) AND emppersonal.deptid=LTRIM(RTRIM('''+@DeptId+'''))';    

  SET @FinalQuery = 'SELECT '+@Query+' '+@Where

  EXEC(@FinalQuery) 
END 

我已经使用这些参数执行了该存储过程:

exec MySP '2','HPD0002',
'
 emppersonal.empfname,
 mdesigmast.designame AS CurrentDesignation,
 ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'') AS appdate,
 IDPT.deptname AS InitialJoinDept, 
 MO1.officeName,pisempprofessional.apporder, DSG.designame AS Designation, 
 mClassMaster.Name AS ClassName,
 mpisrecruitmentmode.Name AS RecruitmentMode,
 pisempprofessional.DesigName 

 FROM emppersonal 
 LEFT JOIN pisempprofessional ON emppersonal.stateid=pisempprofessional.stateid AND emppersonal.deptid=pisempprofessional.deptid And emppersonal.empcd=pisempprofessional.empcd 

 LEFT JOIN mdesigmast ON emppersonal.stateid=mdesigmast.stateid AND emppersonal.currdesig=mdesigmast.desigcode 

 LEFT JOIN mdeptmaster IDPT ON pisempprofessional.stateid=IDPT.stateID AND pisempprofessional.InitialJoiningdeptid=IDPT.deptid 
 LEFT JOIN mofficemaster MO1 ON pisempprofessional.stateid=MO1.stateid AND pisempprofessional.officeid=MO1.officeid 
 LEFT JOIN mdesigmast DSG  ON pisempprofessional.StateID=DSG.StateID AND pisempprofessional.iphdesg=DSG.desigcode 
 LEFT JOIN mClassMaster ON pisempprofessional.iphclass=mClassMaster.ID  
 LEFT JOIN mpisrecruitmentmode ON  pisempprofessional.modeofrec=mpisrecruitmentmode.id

'

当我执行那个过程时,我得到这个错误:

Msg 102, Level 15, State 1, Line 19
Incorrect syntax near '2'.

Msg 105, Level 15, State 1, Line 19
Unclosed quotation mark after the character string '))'.

如何解决上述错误?

谢谢

和其他地方一样,需要使用双撇号:

ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''')

应该就可以了

The apostrophe, or single quote, is a special character in SQL that specifies the beginning and end of string data. This means that to use it as part of your literal string data you need to escape the special character. With a single quote this is typically accomplished by doubling your quote.

喜欢@Mackan提到

The apostrophe, or single quote, is a special character in SQL that specifies the beginning and end of string data. This means that to use it as part of your literal string data you need to escape the special character. With a single quote this is typically accomplished by doubling your quote.

因此将您的 Param

更改为
exec MySP '2','HPD0002',
'emppersonal.empfname,
 mdesigmast.designame AS CurrentDesignation,
 /*Change the below line*/
 ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'') AS appdate,
 IDPT.deptname AS InitialJoinDept, 
 MO1.officeName,pisempprofessional.apporder, DSG.designame AS Designation, 
 mClassMaster.Name AS ClassName,
 mpisrecruitmentmode.Name AS RecruitmentMode,
 pisempprofessional.DesigName 

 FROM emppersonal 
 LEFT JOIN pisempprofessional ON emppersonal.stateid=pisempprofessional.stateid AND emppersonal.deptid=pisempprofessional.deptid And emppersonal.empcd=pisempprofessional.empcd 

 LEFT JOIN mdesigmast ON emppersonal.stateid=mdesigmast.stateid AND emppersonal.currdesig=mdesigmast.desigcode 

 LEFT JOIN mdeptmaster IDPT ON pisempprofessional.stateid=IDPT.stateID AND pisempprofessional.InitialJoiningdeptid=IDPT.deptid 
 LEFT JOIN mofficemaster MO1 ON pisempprofessional.stateid=MO1.stateid AND pisempprofessional.officeid=MO1.officeid 
 LEFT JOIN mdesigmast DSG  ON pisempprofessional.StateID=DSG.StateID AND pisempprofessional.iphdesg=DSG.desigcode 
 LEFT JOIN mClassMaster ON pisempprofessional.iphclass=mClassMaster.ID  
 LEFT JOIN mpisrecruitmentmode ON  pisempprofessional.modeofrec=mpisrecruitmentmode.id'

exec MySP '2','HPD0002',
'emppersonal.empfname,
 mdesigmast.designame AS CurrentDesignation,
 ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''') AS appdate,
 IDPT.deptname AS InitialJoinDept, 
 MO1.officeName,pisempprofessional.apporder, DSG.designame AS Designation, 
 mClassMaster.Name AS ClassName,
 mpisrecruitmentmode.Name AS RecruitmentMode,
 pisempprofessional.DesigName 

 FROM emppersonal 
 LEFT JOIN pisempprofessional ON emppersonal.stateid=pisempprofessional.stateid AND emppersonal.deptid=pisempprofessional.deptid And emppersonal.empcd=pisempprofessional.empcd 

 LEFT JOIN mdesigmast ON emppersonal.stateid=mdesigmast.stateid AND emppersonal.currdesig=mdesigmast.desigcode 

 LEFT JOIN mdeptmaster IDPT ON pisempprofessional.stateid=IDPT.stateID AND pisempprofessional.InitialJoiningdeptid=IDPT.deptid 
 LEFT JOIN mofficemaster MO1 ON pisempprofessional.stateid=MO1.stateid AND pisempprofessional.officeid=MO1.officeid 
 LEFT JOIN mdesigmast DSG  ON pisempprofessional.StateID=DSG.StateID AND pisempprofessional.iphdesg=DSG.desigcode 
 LEFT JOIN mClassMaster ON pisempprofessional.iphclass=mClassMaster.ID  
 LEFT JOIN mpisrecruitmentmode ON  pisempprofessional.modeofrec=mpisrecruitmentmode.id'