Во-первых, вам нужно несколько пробелов в вашей строковой сборке.В частности, измените его на:
set @sql= 'select [ID], '+@col2+' FROM [DBRapBreaza].[dbo].[TblSPAU'+CONVERT(VARCHAR, @val)+ '] WHERE DateTime between '''+CONVERT(VARCHAR(25), @DataStart,121)+ ''' and '''+CONVERT(VARCHAR(25), @DataStop,121)+''';'
Это сделает ваш SQL похожим на:
select [ID], COL_SPAU1_EA FROM [DBRapBreaza].[dbo].[TblSPAU1] WHERE DateTime between '2018-12-20 14:18:02.170' and '2018-12-20 14:18:02.170';
В противоположность следующему:
select [ID]COL_SPAU1_EA FROM [DBRapBreaza].[dbo].[TblSPAU1] WHERE DateTime between2018-12-20 14:19:13.167and2018-12-20 14:19:13.167;
Что являетсяотсутствует:
- Запятая после первого столбца
- Пробел между именами запятых (семантика)
- Пробел после слова между
- Кавычки вокруг дат, которые будут оцениваться по вашим параметрам
- Пробел до и после и в предложении
where
вашего оператора between
Вот почему всегда разумно использовать PRINT @sql
при тестировании динамического SQL.
Затем, как только вы переместите END
в самый конец скрипта, измените ваше выполнение на:
EXEC sp_executesql
@sql,
N'@DataStart datetime, @DataStop datetime, @val int',
@DataStart, @DataStop, @val
Это даст вам следующий код:
USE [DBRapBreaza]
GO
/****** Object: StoredProcedure [dbo].[PS_SpauOPompa] Script Date: 12/19/2018 15:48:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PS_SpauOPompa]
@DataStart datetime,
@DataStop datetime,
@val int
AS
BEGIN
SET NOCOUNT ON;
declare @sql NVARCHAR(max)
declare @col1 varchar --missing a length here
declare @col2 varchar(25)
declare @col3 varchar --missing a length here
set @col1='ID'
set @col2='COL_SPAU'+CONVERT(VARCHAR, @val)+'_EA'
set @col3='DateTime'
set @sql= 'select [ID], '+@col2+' FROM [DBRapBreaza].[dbo].[TblSPAU'+CONVERT(VARCHAR, @val)+ '] WHERE DateTime between '''+CONVERT(VARCHAR(25), @DataStart,121)+ ''' and '''+CONVERT(VARCHAR(25), @DataStop,121)+''';'
--print @sql;
EXEC sp_executesql
@sql,
N'@DataStart datetime, @DataStop datetime, @val int',
@DataStart, @DataStop, @val;
END
Обратите внимание, вы не указали длину для @col1
или @col3
, которая по умолчанию будет 8
, поэтомубудь осторожен там.Вы никогда не использовали эту переменную, поэтому я не уверен, какова ее цель.