Преобразуйте этот встроенный SQL в хранимую процедуру - PullRequest
0 голосов
/ 28 сентября 2019

Как я могу преобразовать этот встроенный SQL в хранимую процедуру

SELECT     
       PM.ProjectName           
      ,[PurposeorReason]    
      ,Reg.Name    
      ,EA.Comment as Comment   
      ,[FromDate]    
      ,[VoucherID]    
      ,[TotalAmount]    
      ,ex.CreatedOn        
  FROM [TimesheetDB].[dbo].[Expense] ex    
  inner join Registration Reg on reg.RegistrationID = ex.UserID    
  inner join ProjectMaster PM on ex.ProjectID =PM.ProjectID 
  inner join AssignedRoles AR on reg.RegistrationID = AR.RegistrationID   
  inner join ExpenseAuditTB EA on ex.ExpenseID = EA.ExpenseID 
  where FromDate  between '2019-09-25' and '2019-09-29' 
  and ea.ProjectID IN (1,2,5)
  and EA.Status = 2  

У меня проблемы с частью (1,2,5).У меня есть это в C # как строка "1,2,5", и ProjectID является целым числом.

Я знаю, что делаю что-то не так.Сам запрос работает хорошо.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Я предлагаю табличный параметр для передачи списков / массивов в хранимую процедуру.В коде C # укажите тип параметра SqlDbType.Structured в качестве типа параметра.Значение параметра может быть DataTable, IEnumerable<SqlDataRecord> или DbDataReader.Я предлагаю DataTable с одним столбцом для этого варианта использования.

CREATE TYPE dbo.TVPProjectIdList AS TABLE (
    ProjectId int NOT NULL PRIMARY KEY
);
GO

CREATE PROCEDURE dbo.Example
      @StartDate date
    , @EndDate date
    , @Status int
    , @ProjectIdList dbo.TVPProjectIdList READONLY
AS
SET NOCOUNT ON;
SELECT     
       PM.ProjectName           
      ,[PurposeorReason]    
      ,Reg.Name    
      ,EA.Comment as Comment   
      ,[FromDate]    
      ,[VoucherID]    
      ,[TotalAmount]    
      ,ex.CreatedOn        
  FROM [TimesheetDB].[dbo].[Expense] ex    
  inner join Registration Reg on reg.RegistrationID = ex.UserID    
  inner join ProjectMaster PM on ex.ProjectID =PM.ProjectID 
  inner join AssignedRoles AR on reg.RegistrationID = AR.RegistrationID   
  inner join ExpenseAuditTB EA on ex.ExpenseID = EA.ExpenseID 
  where FromDate  between @StartDate and @EndDate
  and ea.ProjectID IN (SELECT ProjectId FROM @ProjectIdList)
  and EA.Status = @Status;
GO
0 голосов
/ 28 сентября 2019

Вы должны добавить запятые в начале и в конце строки @ProjectId.

В c# Как получить значение запятой в начале и в конце

string str = "1,2,5";

string replaced=str.Replace(',',',');

string concatenatdvalue=","+replaced+',';

Result = ", 1,2,5,"

Затем значение результата можно передать как @ProjectId в SQL Server ......

CREATE PROCEDURE dbo.sp_ProjectReport
(
    @FromDate VARCHAR(20)=NULL,
    @ToDate VARCHAR(20)=NULL,
    @ProjectId VARCHAR(50)=NULL,
    @StatusId INT=NULL
)
AS
BEGIN


SELECT     
       PM.ProjectName           
      ,[PurposeorReason]    
      ,Reg.Name    
      ,EA.Comment as Comment   
      ,[FromDate]    
      ,[VoucherID]    
      ,[TotalAmount]    
      ,ex.CreatedOn        
  FROM [TimesheetDB].[dbo].[Expense] ex    
  inner join Registration Reg on reg.RegistrationID = ex.UserID    
  inner join ProjectMaster PM on ex.ProjectID =PM.ProjectID 
  inner join AssignedRoles AR on reg.RegistrationID = AR.RegistrationID   
  inner join ExpenseAuditTB EA on ex.ExpenseID = EA.ExpenseID 
  where 
  convert(DATETIME,FromDate)   BETWEEN Convert(DATETIME,CASE WHEN isnull(@FromDate,'')='' THEN FromDate ELSE isnull(@FromDate,'') END)                     
  AND Convert(DATETIME, CASE WHEN isnull(@ToDate,'')='' THEN FromDate ELSE isnull(@ToDate,'') END)    

  and CHARINDEX(','+cast(ea.ProjectID as varchar(100))+',', @ProjectId) > 0

  and EA.Status = @StatusId 

  END 

Скрипт тестирования для выполнения SP

 EXEC dbo.sp_ProjectReport
 @FromDate='2019-09-25',
 @ToDate='2019-09-29',
 @ProjectId=',1,2,5,',
 @StatusId='2'

Примечание: - Здесь я также изменяю логику FromDate на ToDate .........null часть также обрабатывать в пользовательском диапазоне дат .......

Для Eg

Если вы вводите только FromDate как "07/ 06/2017 ", то это даст вам результат (от" 07/07/2017 "до последней даты)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...