Как передать переменную даты в открытом запросе?

avatar
Romba Kettavan
8 апреля 2018 в 06:00
6911
1
0

Я пытаюсь передать переменную даты в открытом запросе, но выдает ошибку типа

"Неверный синтаксис рядом с + "

Вот мой запрос:

DECLARE @fromdt DATETIME = '2018-04-07';
 DECLARE @EndDate1 DATETIME = '2018-04-07';
    Select * from openquery(TIMEV,
       'SELECT REPLACE(LTRIM(REPLACE(badgenumber,"0"," "))," ","0") badgenumber,
checktime as dt
from checkinout a 
join USERINFO c on c.userid=a.userid  
        WHERE checktime >= '''''+CONVERT(CHAR(10), @fromdt, 120)+'''''  AND ''''' + CONVERT(CHAR(10), @EndDate1, 120) + ''''' ')

Я здесь застрял. Заранее спасибо..

Источник
LJ01
8 апреля 2018 в 06:04
0

Вы пытались манипулировать параметрами даты в отдельной команде? Вы должны иметь возможность передавать параметры, а не использовать динамический sql

LJ01
8 апреля 2018 в 06:06
0

Чтобы немного прояснить, установите @param = convert(@param...)

MK_
8 апреля 2018 в 07:10
0

@ LJ01 - это не поможет, потому что документация OPENQUERY явно запрещает использование любых переменных. Так что это не проблема преобразования, это проблема передачи любой переменной. Однако это должно быть исправлено чем-то вроде моего ответа. По предоставленной ссылке есть несколько обходных путей для этого.

LJ01
8 апреля 2018 в 08:02
0

Извините, я все еще не вижу никакого смысла в использовании openquery. Есть ли что-то, что нельзя сделать с помощью стандартного запроса?

Ответы (1)

avatar
MK_
8 апреля 2018 в 07:06
1

OPENQUERY документация прямо говорит:

OPENQUERY не принимает переменные в качестве аргументов.

Поэтому, используя трюк с этого сайта, вы сможете сделать это следующим образом:

DECLARE @fromdt DATETIME = '2018-04-07';
DECLARE @EndDate1 DATETIME = '2018-04-07';

DECLARE @query nvarchar(max) = 
'SELECT * FROM OPENQUERY(TIMEV,
    '' SELECT REPLACE(LTRIM(REPLACE(badgenumber,"0"," "))," ","0") badgenumber,
       checktime AS dt
       FROM checkinout a 
         JOIN USERINFO c on c.userid=a.userid  
       WHERE checktime >= ''''' + CONVERT(CHAR(10), @fromdt, 120) + '''''  AND ''''' + CONVERT(CHAR(10), @EndDate1, 120) + ''''' ''
)';

EXEC(@query);

EDIT: есть также два других метода, предложенных в ссылке, которую я предоставил выше фрагмента кода, если вы хотите их попробовать.