Хранимая процедура для динамического SQL

Как мне написать хранимую процедуру для динамического SQL. Этот код не возвращает строк и говорит неправильный синтаксис рядом с @EmpCode

Базовый запрос находится по адресу http://sqlfiddle.com/. Это для преобразования строк в столбцы, если нет. 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'

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
            ) x
            pivot 
            (
                max(days)
                for type in (' + @cols + ')
            ) p 
            order by id'

http://sqlfiddle.com/

Попробуй это:

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'
Другие вопросы по тегам