Как выполнить хранимую процедуру с параметрами? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть база данных с 40 таблицами.Я хочу выбрать данные из определенной таблицы с помощью одной хранимой процедуры.Первая таблица (TblSPAU1) имеет 6 столбцов с именем: ID, COL_SPAU1_EA, COL_SPAU1_EQ, COL_SPAU1_ore, COL_SPAU1_nivel, DateTime.Четвертая таблица (TblSPAU4), например, имеет следующие 6 столбцов: ID, COL_SPAU4_EA, COL_SPAU4_EQ, COL_SPAU4_ore, COL_SPAU4_nivel, DateTime.Так что я хочу, чтобы выбрать данные из таблицы X от DateStart до DateStop.На данный момент я сделал следующее:

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
set @col1='ID'
declare @col2 varchar(25) 
set @col2='COL_SPAU'+CONVERT(VARCHAR, @val)+'_EA' 
declare @col3 varchar 
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)+';'

END

EXEC sp_sqlexec @sql, N'@DataStart datetime,@DataStop datetime,@val int',  @DataStart, @DataStop, @val

Я хочу выбрать, скажем, столбец ID и кулак из определенной таблицы.@val представляет номер таблицы, из которой я хочу выбрать данные.На sp_sqlexec у меня есть подсказка, которая говорит, что у меня слишком много аргументов.Когда я выполняю EXEC, он выдает мне эту ошибку: Msg 137, Level 15, State 2, Line 1. Must declare the scalar variable "@sql". Мой вопрос: как мне выполнить эту хранимую процедуру?Большое спасибо заранее!

1 Ответ

0 голосов
/ 20 декабря 2018

Во-первых, вам нужно несколько пробелов в вашей строковой сборке.В частности, измените его на:

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, поэтомубудь осторожен там.Вы никогда не использовали эту переменную, поэтому я не уверен, какова ее цель.

...