2010-04-30 2 views
0

를 사용하여 나는 데이터베이스에 다음 텍스트를 보내는 SSRSreport이있다 : 나는 프로파일이를 볼 때간부 sp_executesql에 오류 '1 근처의 구문이 잘못되었습니다'날짜 매개 변수

EXEC ('DECLARE @TeamIds as TeamIdTableType ' + @Teams + 
     ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , ' + 
     @DateFrom + ', ' + @DateTo + ', ' + @InputRankGroups + ', ' + 
     @SubCategories) 

는이 같은 해석 :

exec sp_executesql N'EXEC (''DECLARE @TeamIds as TeamIdTableType '' + @Teams + 
'' EXEC rpt.DWTypeOfSicknessByCategoryAndEmployeeDetailsReport @TeamIds, '' + 
@DateFrom + '', '' + @DateTo + '', '' + @InputRankGroups + '', '' + 
@SubCategories)', 
N'@Teams nvarchar(34),@DateFrom datetime,@DateTo datetime, 
@InputRankGroups varchar(1),@SubCategories bit', 
@Teams=N'INSERT INTO @TeamIds VALUES (5);', 
@DateFrom='2010-02-01 00:00:00',@DateTo='2010-04-30 00:00:00', 
@InputRankGroups=N'1',@SubCategories=1 

이 SQL을 실행하면 날짜에 오류가 발생합니다.

날짜 형식을 변경해 보았지만 도움이되지 않습니다. 날짜를 삭제하면 제대로 작동합니다.

답변

1

나는 여기서 무슨 일이 벌어지고 있는지 알고 있다고 생각합니다. 실행되는 SQL이

EXEC ('DECLARE @TeamIds as TeamIdTableType ' + @Teams 
    + ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , ' 
    + @DateFrom + ', ' 
    + @DateTo + ', ' 
    + @InputRankGroups + ', ' 
    + @SubCategories) 

경우 ... SQL 서버는 먼저 문자열 연결을 한 후 연결된 문자열에 EXEC를 호출합니다. 주어진 매개 변수의 값으로, 이것은 연결된 문자열이 같은 것입니다 의미 (읽기 쉽도록 조정 공백으로) 다음

DECLARE @TeamIds as TeamIdTableType 
INSERT INTO @TeamIds VALUES (5); 
EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , 
    2010-02-01 00:00:00, 2010-04-30 00:00:00, 1, 1 

문제는 해석 할 수있다, 그래서 EXEC는 매개 변수가있는 쿼리가되지 않는 것입니다 datetime 매개 변수를 원시 문자열로 사용하지만 인용 부호가없는 원시 문자열로는 올바른 구문이 아닙니다. 이 두 가지 방법 중 하나를 고칠 수 있습니다.

먼저 쉬운 방법 : datetime 문자열을 인용하십시오.

DECLARE @TeamIds as TeamIdTableType 
INSERT INTO @TeamIds VALUES (5); 
EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , 
    '2010-02-01 00:00:00', '2010-04-30 00:00:00', 1, 1 

둘째, 거의 것과 같이 쉽게하지만, 더 올바른 방법 :

EXEC ('DECLARE @TeamIds as TeamIdTableType ' + @Teams 
    + ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , ' 
    + '''' + @DateFrom + ''', ' 
    + '''' + @DateTo + ''', ' 
    + @InputRankGroups + ', ' 
    + @SubCategories) 

이 당신에게 유효한 구문 뭔가를 제공하는 매개 변수가있는 쿼리를 사용합니다.

DECLARE @sql varchar(max) 
SET @sql = 'DECLARE @TeamIds AS TeamIdTableType ' + @Teams 
    + ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , @DateFrom, @DateTo, @InputRankGroups, @SubCategories' 
EXEC sp_executesql @sql, N'@DateFrom datetime,@DateTo datetime,@InputRankGroups varchar(1),@SubCategories bit', 
    @DateFrom, @DateTo, @InputRankGroups, @SubCategories 

당신이 약간 더 자세한 있지만, 특정 값 유형을 탈출하는 방법에 대해 걱정하지 않아도 이쪽으로. @Teams에서 원시 SQL을 매개 변수로 전달하기 때문에 매개 변수화를 완벽하게 수행 할 수 없습니다. 이것은 당신이 통제 할 수있는 것이 아닐 수도 있습니다 - 저는 SSRS에 익숙하지 않습니다.

0

솔루션을 공유해 주셔서 감사합니다. 두 번째 구현하기 위해 노력하지만 저장 프로 시저를 호출하는 오류가 발생했습니다. 나는 문법을 약간 조정할했다 이것은 나를 위해 일한 :

DECLARE @vSQL nvarchar(max) = N' 
DECLARE @customerIdList Report.IntegerListTableType; 
'[email protected]+'; 
EXEC rpt_CustomerTransactionSummary 
@[email protected], 
@[email protected], 
@[email protected], 
@customerIds = @customerIdList'; 
exec sp_executesql 
    @vSQL, 
    N'@startDate datetime, @endDate datetime, @accountType int', 
    @startDate, 
    @endDate', 
    @accountType; 

이 구문이 너무 NULL 값에 (예를 들어, @ ACCOUNTTYPE = NULL)

수 있습니다
관련 문제