2013-11-11 3 views
0

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

Базовый запрос: http://sqlfiddle.com/#!3/6ad02e/9. Это преобразование строк в cols, если no. 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' 
+0

'E.EmpCode LIKE% @ EmpCode%' должен быть 'E.EmpCode LIKE '% @ EmpCode%'' ' – dav1dsm1th

+0

IF @EmpCode =«+ '' + ''должен быть' IF @EmpCode =' '' '' – dav1dsm1th

+0

Спасибо. Я изменил его на LIKE% '+ @ EmpCode +'% OR ... Он скомпилирован успешно, но возвращает 0 строк – Ruby

ответ

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/#!3/6ad02e/29/0

+0

. «Куда», пожалуйста, – Ruby

+1

@Ruby: это должно быть почти то же самое - извините, я пропустил эту часть вопроса. Я не могу проверить его, потому что он жалуется на 'E.Deleted, E.EmpCompanyId и E.EmpCode', которые, похоже, пропущены из определения tblEmp. Вам просто нужно изменить '(E.EmpCode LIKE% @ EmpCode% OR @EmpCode IS NULL)' часть 'WHERE' to' (E.EmpCode LIKE ''% @ EmpCode% '' ИЛИ ​​@EmpCode IS NULL) '. – a1ex07

+0

Спасибо a Ton, a1ex07. – Ruby

0

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

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 %[email protected]+% OR @EmpCode IS NULL)** 
     ) x 
     pivot 
     (
      max(days) 
      for type in (' + @cols + ') 
     ) p 
     order by id' 
+0

Возвращаемые нулевые строки. Неправильный синтаксис рядом с SET рядом с '+' – Ruby

+0

попробуйте удалить обе пары '**' –

Смежные вопросы