【问题标题】:Execute Dynamic SQL执行动态 SQL
【发布时间】:2015-03-18 15:07:12
【问题描述】:

我正在使用动态 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

'

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

消息 102,第 15 级,状态 1,第 19 行
'2' 附近的语法不正确。

消息 105,第 15 级,状态 1,第 19 行
字符串'))'后面的非闭合引号。

如何解决以上错误?

谢谢

【问题讨论】:

  • ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'') 更改为ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''')
  • 谢谢@wewestthemenace.. :)。您可以将其发布为答案..
  • 您可以接受@Mackan 的回答,因为我们只是在说同样的话。
  • 我只想补充一点,您在构造查询字符串时不必强制转换值...所以SET @Where=' where emppersonal.stateid=Cast(''' + @StateId + ''' AS INT)... 可以很容易地被SET @Where=' where emppersonal.stateid=' + @StateId + '...' 替换,除非这个@StateId 可以其他事情,而不仅仅是数字。我还建议将其类型从char(3) 更改为varchar(3),这样数字就可以一直保持在需要的长度。

标签: sql-server sql-server-2008 dynamic-sql


【解决方案1】:

就像在其他地方一样,你需要使用双撇号:

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

应该这样做

撇号或单引号是 SQL 中的一个特殊字符,用于指定字符串数据的开头和结尾。这意味着要将其用作文字字符串数据的一部分,您需要转义特殊字符。对于单引号,这通常是通过将引号加倍来实现的。

【讨论】:

    【解决方案2】:

    就像提到的@Mackan

    撇号或单引号是 SQL 中的一个特殊字符 指定字符串数据的开始和结束。这意味着要使用 它作为您的文字字符串数据的一部分,您需要转义特殊的 特点。使用单引号,这通常由 加倍报价。

    所以改变你的Param from

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2015-02-07
      • 2013-08-16
      相关资源
      最近更新 更多