2014-04-23 2 views
3

IN 절에서 사용하려면 쉼표로 구분 된 날짜 문자열을 저장 프로 시저에 보내려고합니다. 그러나 "날짜 및/또는 시간을 문자열로 변환 할 때 변환이 실패했습니다."라는 오류 메시지가 나타납니다.저장 프로 시저, 전달 날짜 배열, 쉼표로 구분됩니다. 변환 오류

나는이 날짜를 사용하여 일치하는 가격을 찾으려고합니다. C 번호 :을 디버깅 할 때

StringBuilder LastDaysOfEveryMonth = new StringBuilder(); 
DataAccess da = new DataAccess(); 
SqlCommand cm = new SqlCommand(); 
cm.CommandType = CommandType.StoredProcedure; 
var pList = new SqlParameter("@DateList", DbType.String); 
pList.Value = LastDaysOfEveryMonth.ToString(); 
cm.Parameters.Add(pList); 
... 
cm.CommandText = "spCalculateRollingAverage"; 
DataSet ds = da.ExecuteDataSet(ref cm); 

전달 된 문자열의 값이 다음 DbType과 문자열 SQLDbType NVARCHAR와

'2013-07-31','2013-08-30','2013-09-30','2013-10-31','2013-11-29','2013-12-31', 
'2014-01-31','2014-02-28','2014-03-31','2014-04-03', 

.

모든 조언을 주시면 감사하겠습니다. SQL :

CREATE PROCEDURE [dbo].[spCalculateRollingAverage] 
@StartDate DateTime, 
@EndDate DateTime, 
@Commodity nvarchar(10), 
@PeakType nvarchar (10), 
@BaseID int, 
@NumberOfMonths int, 
@DateList nvarchar(MAX) 

AS 

    BEGIN 

    select TermDescription,ContractDate,Price,SortOrder into #tbtp from BaseTermPrice 
    inner hash join Term 
    on 
    Term.TermID = BaseTermPrice.TermID 
    where 
    BaseID = @BaseID and ((@PeakType IS NULL and PeakType is null) or 
    (@PeakType IS  NOT NULL and [email protected])) 
    and ((@DateList IS NULL and ContractDate between @StartDate and @EndDate) 
    or (@StartDate IS NULL and ContractDate in (@DateList))) 
    order by 
    ContractDate,SortOrder 
+0

을 위해. – logixologist

답변

2

는이 같은 IN 절에 VARCHAR 변수를 사용할 수 없습니다. 실행할 동적 SQL에 추가하거나 임시 테이블/임시 변수로 분할해야합니다.

SplitString 기능을 사용하여 예를 들어, 당신은 같은 것을 할 수 있습니다 : 우선 당신이 전달하는 문자열의 마지막 쉼표를 제거

or (@StartDate IS NULL and ContractDate in 
      (SELECT Name from dbo.SplitString(@DateList))))