2013-05-17 6 views
4

Я пытаюсь передать переменную в ЗЕЬЕСТ в OPENROWSET, но я получаю сообщение об ошибкеSQL SELECT * FROM OPENROWSET с переменной

DECLARE @dDateTIME DATE 

SET @dDateTIME = (SELECT SalesDate FROM dbo.SalesDate) 

INSERT INTO dbo.tblSales 
SELECT * FROM OPENROWSET('MSDASQL', 'dsn=mydsn;uid=myid;pwd=mypwd;', 
    'SELECT 
     ID, 
     TranDate, 
     ProductID, 
     CostValue, 
     SalesValue, 
     QtySold, 
    FROM tblSales WHERE TranDate='' + @dDateTIME + ''') 

DECLARE @dDateTIME DATE 
SET @dDateTIME = (SELECT SalesDate FROM dbo.SalesDate) 

DECLARE @SQL NVARCHAR(1024) = 
'SELECT 
     ID, 
     TranDate, 
     ProductID, 
     CostValue, 
     SalesValue, 
     QtySold, 
    FROM tblSales WHERE TranDate=''' + CAST(@dDateTIME AS VARCHAR(64)) + '''' 

DECLARE @RunSQL NVARCHAR(max) 
SET @RunSQL= 
    'SELECT * FROM OPENROWSET (''MSDASQL'', ''dsn=mydsn;uid=myid;pwd=mypwd;'',''EXEC @SQL'')'` 

Что синтаксис этого я использую, чтобы применить к @SQL?

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

Ошибка: OLE DB провайдер "MSDASQL" для связанного сервера "(нуль)" возвращается сообщение «[Pervasive] [ODBC Client Interface] [LNA] [распространяющийся ] [ODBC интерфейс двигателя] Ошибка в предикате: Trandate = '(SELECT @dDateTIME) "

+3

*** ЧТО *** это ошибка, которую вы получаете!?!?!?!?!? Мы не можем читать ваш экран - ни ваш разум ... вам нужно будет ** рассказать нам ... .... и пока вы на нем - пожалуйста, также сообщите нам, какая база данных * ** вы используете (и какую версию); SQL - это просто язык запроса - не продукт базы данных .... –

+0

База данных, которую я использую, - SQL Server 2008 r2 База данных, к которой подключен dsn, является Pervasive Я знаю, что ошибка вызвана синтаксисом, который я использую при передаче вариации. Если я ввожу значение datevalue в оператор WHERE, он работает нормально. Ошибка: поставщик OLE DB «MSDASQL» для связанного сервера »(null)« возвращенное сообщение »[Pervasive] [Клиентский интерфейс ODBC] [LNA] [Pervasive] [Интерфейс двигателя ODBC] Ошибка в предикате: TranDate = '(SELECT @dDATETIME). – user2393602

ответ

1

Ваших переменный не сцепляются в строку (ее ''' закрыть строку с '), чтобы исправить это (и выполнить необходимое преобразование типа):

DECLARE @SQL NVARCHAR(1024) = 
'SELECT 
     ID, 
     TranDate, 
     ProductID, 
     CostValue, 
     SalesValue, 
     QtySold, 
    FROM tblSales WHERE TranDate=''' + CAST(@dDateTIME AS VARCHAR(64)) + '''' 

Кроме того, вы не можете использовать выражение или переменную с OPENROWSET, поэтому вам нужно позвонить по телефону EXEC()/sp_executeSQL, см. Using a Variable in OPENROWSET Query

+0

'DECLARE @dDATETIME DATE SET @dDATETIME = (SELECT SalesDate FROM dbo.SalesDate) DECLARE @SQL NVARCHAR (1024) = 'SELECT ID, TranDate, ProductID, CostValue, SalesValue, QtySold, FROM tblSales WHERE TranDate =' '' + CAST (@dDATETIME AS VARCHAR (64)) + '' '' DECLARE @RunSQL NVARCHAR (max) SET @ RunSQL = 'SELECT * FROM OPENROWSET (' 'MSDASQL' ',' 'dsn = mydsn; uid = myid ; pwd = mypwd; '', '' EXEC @SQL '') '' Какой синтаксис я использую для применения @SQL ??? – user2393602

1

Вы можете динамически создавать инструкцию SQL и затем запускать эту команду.

DECLARE @dDateTIME DATE, 
     @RunSQL NVARCHAR(max) 

SET @dDateTIME = (SELECT SalesDate FROM dbo.SalesDate) 

SELECT @RunSQL = 
    'INSERT INTO dbo.tblSales 
    SELECT * FROM OPENROWSET(''MSDASQL'', ''dsn=mydsn;uid=myid;pwd=mypwd;'', 
    ''SELECT 
     ID, 
     TranDate, 
     ProductID, 
     CostValue, 
     SalesValue, 
     QtySold, 
    FROM tblSales WHERE TranDate=''''' + CONVERT(nvarchar, @dDateTIME, 112) + ''''''')' 
--PRINT @RunSQL  
EXEC sp_executesql @RunSQL