Проблема синтаксиса в SQL Server при использовании OPENROWSET

Я пытаюсь выполнить хранимую процедуру, которая требует, чтобы переменные передавались ей. Один статический, другой динамический.

DECLARE @Filt DATETIME 
SET @Filt = (SELECT DISTINCT MAX(Date) FROM Data.db.Staging)
SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14  \MSSQL2012;Trusted_Connection=yes;', 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt ')

но это не работает, вернул ошибку «Сообщение 8180, уровень 16, состояние 1, операторы строки 1 не могут быть подготовлены. Сообщение 102, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с '@Filt' ."

Я предполагаю, что это потому, что Filt является динамическим оператором. Итак, я попробовал это

DECLARE @FilterData DATETIME
DECLARE @sql VARCHAR(200) 
SET @Filt = (SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
SET @sql = 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt =  '  + @Filt

SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14\MSSQL2012;Trusted_Connection=yes;',
 @sql)

Но я получаю сообщение обратно

«Сообщение 102, уровень 15, состояние 1, строка 24. Неверный синтаксис рядом с '@sql'».

Кажется, что OPENROWSET может принимать только строки. Но я хочу передать переменную, которая является динамической.


person SantoshGupta7    schedule 16.07.2014    source источник


Ответы (2)


Вы должны поместить весь оператор в переменную и запустить его, а также преобразовать @FilterData в varchar, чтобы объединить его.

Вы не можете использовать переменные с openquery/openrowset.

Попробуйте это и проверьте вывод на печать... если он работает и выглядит нормально, тогда EXEC(@sql2)

DECLARE @FilterData DATETIME
DECLARE @sql VARCHAR(200), @sql2 VARCHAR(500)
SET @FilterData = '2014-07-01'--(SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
SET @sql = 'EXEC GetData.db.Staging @Mode = ''''Date'''', @Filt =  '''''  + CONVERT(VARCHAR(20),@FilterData ,120) + ''''''

SET @sql2 = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14\MSSQL2012;Trusted_Connection=yes;'',
 '''+@sql+''')'

print @sql2
--exec(@sql2)
person Dave Cullum    schedule 16.07.2014
comment
Это определенно помогло! Однако теперь я получаю эту проблему: Сообщение 102, уровень 15, состояние 1, строка 2 Неверный синтаксис рядом с «2014». Сообщение 105, уровень 15, состояние 1, строка 2 Незакрытые кавычки после строки символов ')'. - person SantoshGupta7; 17.07.2014
comment
Обновлено, отсутствует ,. Однако я не вижу незакрытых кавычек. Вы разобрались? - person Dave Cullum; 17.07.2014

Вам нужно сделать весь запрос динамическим, не уверен, что я его прибил, но что-то вроде:

DECLARE @Filt DATETIME 
       ,@sql VARCHAR(MAX)
SET @Filt = (SELECT MAX(Date) FROM Data.db.Staging)
SET @sql = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14  \MSSQL2012;Trusted_Connection=yes;'', ''EXEC GetData.db.Staging @Mode = ''''Date''' +@Filt+ ')'
EXEC (@sql)
person Hart CO    schedule 16.07.2014
comment
Это определенно помогло! Однако теперь я получаю эту проблему: Сообщение 102, уровень 15, состояние 1, строка 2 Неверный синтаксис рядом с «2014». Сообщение 105, уровень 15, состояние 1, строка 2 Незакрытые кавычки после строки символов ')'. Где 2014 является частью даты MAX, найденной в @Filt - person SantoshGupta7; 17.07.2014
comment
@user3259896 user3259896 Можете ли вы показать мне строку, которая выполняется с жестко запрограммированным значением вместо динамической версии? Я просто не уверен, как EXEC GetData.db.Staging @Mode = ''''Date''' +@Filt+ ') должен быть структурирован. - person Hart CO; 17.07.2014