Внутри строки в кавычках вы должны экранировать одинарную кавычку с дополнительной одинарной кавычкой, в которой вы начинаете видеть четыре и пять одинарных кавычек подряд. Чтобы упростить вещи, я бы сделал пару предложений.
Во-первых, держите свои струны более разделенными в своих обязанностях. Ваша переменная @SQL
содержит необходимую конечную пунктуацию для вашего OPENQUERY
, но начальная пунктуация находится в переменной @OPENQUERY
. (Это может быть яснее в приведенном ниже коде.)
Кроме того, я бы рекомендовал использовать правильные типы данных (например, даты), а затем использовать функцию CONCAT
, которая удобно обрабатывает все данные преобразования типов для вас.
Итак, измененная версия того, с чего вы начали, будет выглядеть так:
DECLARE @OPENQUERY nvarchar(4000)
, @LinkedServer nvarchar(256)
, @SQL NVARCHAR(4000);
--Set your dates. Use the right data type to avoid sending
--invalid dates into your query. Easier to debug them here.
DECLARE @STARTDT DATE = '2019-01-01'
,@ENDDT DATE = '2019-03-01';
--Set your server.
SET @LinkedServer = 'ProductionSvr';
--Then set up the inner query.
SET @SQL =
CONCAT(
'select *
from SalesData a
where a.Sale_date between ''', @StartDt, ''' and ''', @ENDDT,'''');
--Set up the OPENQUERY variable with all of the punctuation that it needs,
--so you just need to drop in your LinkedServer name and your SQL statment.
--Use CONCAT because it handles the data type conversions for you.
SET @OPENQUERY = CONCAT('SELECT * FROM OPENQUERY(',@LinkedServer,',''(',@SQL,')'')');
PRINT @OPENQUERY;
Результат:
SELECT * FROM OPENQUERY(ProductionSvr,'(select *
from SalesData a
where a.Sale_date between '2019-01-01' and '2019-03-01')')