【问题标题】:Stored Procedure for dynamic SQL动态 SQL 的存储过程
【发布时间】:2013-11-11 15:04:01
【问题描述】:

我应该如何为动态 SQL 编写存储过程。此代码不返回任何行,并且在 @EmpCode 附近显示不正确的语法

基本查询位于 http://sqlfiddle.com/#!3/6ad02e/9 。如果不是,则将行转换为列。 cols 是未知的。我正在尝试将参数发送到同一个查询,只是添加了“粗体”代码...

set @query = '**DECLARE @CompanyId uniqueidentifier = null,   
                      @EmpCode nvarchar(50) = null
               IF @CompanyId='+'00000000-0000-0000-0000-000000000000'+'
               SET @CompanyId = NULL
               IF @EmpCode = '+''+'
               SET @EmpCode = NULL**

              SELECT id, name,' + @cols + ' 
        from 
        (
          select e.id, e.name, lt.type, l.days 
          from tblEmp e
          left outer join tblEmpLeaves l 
            on e.id = l.empId
          left outer join tblLeaveType lt 
            on l.leaveId = lt.Id
          **WHERE
            (E.Deleted = 0) AND
            (E.EmpCompanyId = @CompanyId OR @CompanyId IS NULL)AND
            (E.EmpCode LIKE %@EmpCode% OR @EmpCode IS NULL)**
        ) x
        pivot 
        (
            max(days)
            for type in (' + @cols + ')
        ) p 
        order by id'

【问题讨论】:

  • E.EmpCode LIKE %@EmpCode%需要是E.EmpCode LIKE '%@EmpCode%'
  • IF @EmpCode = '+''+' 必须是IF @EmpCode = ''''
  • 谢谢。我将其更改为 LIKE %'+@EmpCode+'% OR... 它编译成功但返回 0 行

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


【解决方案1】:

您似乎没有正确转义引号。以下工作没有错误:

set @query = '
DECLARE @CompanyId uniqueidentifier = null,   
                      @EmpCode nvarchar(50) = null
               IF @CompanyId=''00000000-0000-0000-0000-000000000000''
               SET @CompanyId = NULL 
               IF @EmpCode =''''
               SET @EmpCode = NULL 
SELECT id, name,' + @cols + ' 
            from 
            (
              select e.id, e.name, lt.type, l.days 
              from tblEmp e
              left outer join tblEmpLeaves l 
                on e.id = l.empId
              left outer join tblLeaveType lt 
                on l.leaveId = lt.Id
            ) x
            pivot 
            (
                max(days)
                for type in (' + @cols + ')
            ) p 
            order by id'

http://sqlfiddle.com/#!3/6ad02e/29/0

【讨论】:

  • 请问'Where'部分怎么样
  • @Ruby :应该差不多 - 抱歉,我错过了问题的那一部分。我无法测试它,因为它抱怨 E.Deleted, E.EmpCompanyId, and E.EmpCode 似乎从 tblEmp 定义中遗漏了。您只需将WHERE(E.EmpCode LIKE %@EmpCode% OR @EmpCode IS NULL) 部分更改为(E.EmpCode LIKE ''%@EmpCode%'' OR @EmpCode IS NULL)
  • 非常感谢,a1ex07。
【解决方案2】:

试试这个:

set @query = 'DECLARE @CompanyId uniqueidentifier = null,   
                      @EmpCode nvarchar(50) = null
               IF @CompanyId='+'00000000-0000-0000-0000-000000000000'+'
               SET @CompanyId = NULL
               IF @EmpCode = '+''+'
               SET @EmpCode = NULL**

              SELECT id, name,' + @cols + ' 
        from 
        (
          select e.id, e.name, lt.type, l.days 
          from tblEmp e
          left outer join tblEmpLeaves l 
            on e.id = l.empId
          left outer join tblLeaveType lt 
            on l.leaveId = lt.Id
          WHERE
            (E.Deleted = 0) AND
            (E.EmpCompanyId = @CompanyId OR @CompanyId IS NULL)AND
            (E.EmpCode LIKE %+@EmpCode+% OR @EmpCode IS NULL)**
        ) x
        pivot 
        (
            max(days)
            for type in (' + @cols + ')
        ) p 
        order by id'

【讨论】:

  • 尝试删除两对**
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2013-07-18
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多