Member 11149766 Ответов: 3

Ошибка Sql-getting должна объявить скалярную переменную "@from_DATE".


DECLARE @Columns NVARCHAR(MAX) = ''
DECLARE @FROM_DATE date
DECLARE @TO_DATE date 
set  @FROM_DATE = '10/11/2017' 
set @TO_DATE ='10/11/2018'
      SELECT @Columns  =
      @Columns + QUOTENAME(marriage_type) + ','
      FROM (SELECT top 4 marriage_type from marriages m,DOCUMENT_TYPES d
      where d.recordable_document='Y' and m.marriage_type=d.document_type and d.MODULE_ID = 'MARRIAGE'
      group by marriage_type) t
      SELECT @Columns = SUBSTRING(@Columns, 0, LEN(@Columns))
      DECLARE @Query NVARCHAR(MAX) =
      'SELECT location,ISNULL(Year(DATE_OF_APP),null) as Year ,  DATENAME(month, 2018/str(Month(DATE_OF_APP))/2) as MONTH,' + @Columns + ' FROM
      (SELECT DATE_OF_APP, location,marriage_type  FROM marriages m where DATE_OF_APP is not null and m.DATE_OF_APP >= @FROM_DATE AND m.DATE_OF_APP <= @TO_DATE) SourceTable
      PIVOT
      (
      count(marriage_type)
      FOR marriage_type IN (' + @Columns + ')
      ) AS PivotTable '
      EXECUTE(@query)


Что я уже пробовал:

DECLARE @Columns NVARCHAR(MAX) = ''
DECLARE @FROM_DATE date
DECLARE @TO_DATE date 
set  @FROM_DATE = '10/11/2017' 
set @TO_DATE ='10/11/2018'
      SELECT @Columns  =
      @Columns + QUOTENAME(marriage_type) + ','
      FROM (SELECT top 4 marriage_type from marriages m,DOCUMENT_TYPES d
      where d.recordable_document='Y' and m.marriage_type=d.document_type and d.MODULE_ID = 'MARRIAGE'
      group by marriage_type) t
      SELECT @Columns = SUBSTRING(@Columns, 0, LEN(@Columns))
      DECLARE @Query NVARCHAR(MAX) =
      'SELECT location,ISNULL(Year(DATE_OF_APP),null) as Year ,  DATENAME(month, 2018/str(Month(DATE_OF_APP))/2) as MONTH,' + @Columns + ' FROM
      (SELECT DATE_OF_APP, location,marriage_type  FROM marriages m where DATE_OF_APP is not null and m.DATE_OF_APP >= @FROM_DATE AND m.DATE_OF_APP <= @TO_DATE) SourceTable
      PIVOT
      (
      count(marriage_type)
      FOR marriage_type IN (' + @Columns + ')
      ) AS PivotTable '
      EXECUTE(@query)




Я получаю ошибку :

Msg 137, Уровень 15, Состояние 2, Строка 2
Необходимо объявить скалярную переменную "@FROM_DATE".

3 Ответов

Рейтинг:
2

Richard Deeming

Чтобы устранить ошибку, используйте процедуры sp_executesql[^], передавая параметры, используемые вашим запросом:

EXEC sp_executesql @Query, 
    N'@FROM_DATE date, @TO_DATE date', 
    @FROM_DATE = @FROM_DATE, 
    @TO_DATE = @TO_DATE;


Рейтинг:
0

OriginalGriff

@FROM_DATE и @TO_DATE объявляются во внешнем коде, который строит строку запроса, и ссылаются на нее, когда она выполняется как отдельная команда.

Поскольку команда не знает, что это такое, вы получаете ошибку.

Есть и другие вещи:
1) Не устанавливайте даты в этом формате: используйте вместо этого yyyy-MM-dd;t может быть неверно истолковано как dd-MM-yyyy или MM-dd-yyyy в зависимости от настроек SQL-поля.
2) я бы очень тщательно подумал, прежде чем делать такой запрос: вы создаете запрос, который пытается быть динамическим, но на самом деле рискует внедрить SQL через данные столбцов - особенно потому, что вы не указываете порядок, в котором должны быть возвращены столбцы, поэтому SQL может возвращать их в любом порядке, который он предпочитает.
Лично я бы так не поступил: это опасное решение дурацкой проблемы.


Рейтинг:
0

kirthiga S

Передача параметров внутри запроса решит эту проблему

DECLARE @Columns NVARCHAR(MAX) = ''
SELECT @Columns  =
@Columns + QUOTENAME(marriage_type) + ','
FROM (SELECT top 4 marriage_type from marriages m,DOCUMENT_TYPES d
where d.recordable_document='Y' and m.marriage_type=d.document_type and d.MODULE_ID = 'MARRIAGE'
group by marriage_type) t
SELECT @Columns = SUBSTRING(@Columns, 0, LEN(@Columns))
DECLARE @Query NVARCHAR(MAX) =
'DECLARE @FROM_DATE date= ''10/11/2017''
DECLARE @TO_DATE date=''10/11/2018''
SELECT location,ISNULL(Year(DATE_OF_APP),null) as Year ,  DATENAME(month, 2018/str(Month(DATE_OF_APP))/2) as MONTH,' + @Columns + ' FROM
(SELECT DATE_OF_APP, location,marriage_type  FROM marriages m where DATE_OF_APP is not null and m.DATE_OF_APP >= @FROM_DATE AND m.DATE_OF_APP <= @TO_DATE) SourceTable
PIVOT
(
count(marriage_type)
FOR marriage_type IN (' + @Columns + ')
) AS PivotTable '
EXECUTE(@query)