Мне кажется, я знаю, что здесь происходит. Если выполняемый SQL -
EXEC ( 'DECLARE @TeamIds as TeamIdTableType ' + @Teams
+ ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , '
+ @DateFrom + ', '
+ @DateTo + ', '
+ @InputRankGroups + ', '
+ @SubCategories )
... SQL Server сначала выполнит объединение строк, а затем вызовет 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 как необработанные строки, но как необработанные строки без кавычек они не имеют правильного синтаксиса. Вы можете исправить это одним из двух способов.
Во-первых, простой способ : процитировать строки даты и времени.
EXEC ( 'DECLARE @TeamIds as TeamIdTableType ' + @Teams
+ ' EXEC rpt.DWTypeOfSicknessByCategoryReport @TeamIds , '
+ '''' + @DateFrom + ''', '
+ '''' + @DateTo + ''', '
+ @InputRankGroups + ', '
+ @SubCategories )
Это дает вам что-то с правильным синтаксисом:
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
Второй, почти простой, но более правильный способ : используйте параметризованный запрос.
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
Таким образом, вам не нужно беспокоиться о том, как избежать определенных типов значений, хотя это немного более многословно. Обратите внимание, что вы не можете полностью его параметризировать из-за передачи необработанного SQL в качестве параметра в @Teams. Это может быть не то, что вы можете контролировать - я не очень знаком с SSRS.