Возврат данных между датами «до» и «из» в динамическом запросе SQL - PullRequest
0 голосов
/ 23 мая 2018

этот код не работает, теперь я попытался добавить параметры @FromDate и @ToDate, чтобы я мог выбрать даты, в которые должен выполняться запрос.Любые корректоры кода, чтобы помочь, пожалуйста?Сообщение в том, что мне нужно объявить скалярные переменные @FromDate и @ToDate, но я их уже объявил?Синтаксис рядом с 'As' также, по-видимому, неверен.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

В предложении where для выбора для курсора измените

and t.create_date = @FromDate
and t.create_date = @ToDate

на

and t.create_date >= @FromDate
and t.create_date <= @ToDate

и внутри вашего курсора измените блок SET @SQL = ... на

SET
 @SQL = ' Select ''' + @DatabaseName + ''' AS DatabaseName, ''' + @SchemaName + ''' AS SchemaName,
  ''' + @TableName + ''' AS TableName,
  ''' + @ColumnName + ''' AS ColumnName,
  ''' + @DataType + ''' AS DataType,
  (select  ''' + convert(varchar(30),@FromDate,101) + ''') As StartDate,
  (select ''' + convert(varchar(30),@ToDate,101) + ''') As EndDate,
  (select count(*)  from ' + @FullyQualifiedTableName + ' ) AS TotalRowCount,
  (Select CAST(SUM(CASE WHEN ''' + @ColumnName + ''' IS  NULL THEN 1 ELSE 0 END) as int)  from ' + @FullyQualifiedTableName + ' )
  AS NullCount,
    (Select sum (Case when  ' + @ColumnName + ' is not null and ( ' + @ColumnName + ' <= ''1900-01-01''
 or ' + @ColumnName + '  > getdate()) then 1 else 0 end) from ' + @FullyQualifiedTableName + ' )
AS  InvalidCount,
    (Select ''DateOfBirth'') 
    As ValidityCheck
'
0 голосов
/ 23 мая 2018

Когда вы выполняете SQL через EXEC или sp_executesql, изменения области действия и локальные временные таблицы и переменные больше не доступны.

DECLARE @variable INT = 10

EXEC ('SELECT @variable')

--Msg 137, Level 15, State 2, Line 1
--Must declare the scalar variable "@variable".

Для правильной работы динамического SQL вам придетсяВпишите значение вашей переменной непосредственно в SQL с помощью правильной функции CONVERT (вам нужно будет записать ее как литерал).

Поэтому, когда вы выполните

'select  (''@FromDate'')'

, вы будетена самом деле нужно сделать

'select  (''' + CONVERT(VARCHAR(30), @FromDate) + ''')'

Убедиться, что он может быть правильно преобразован из строкового литерала в правильный формат.

...