2013-05-17 74 views
4

我想一個變量傳遞到OPENROWSET一個SELECT語句,但我一直收到錯誤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」 鏈接服務器 「(空)」 返回了消息「[普及] [ODBC客戶端界面] [LNA] [普適] [ODBC引擎接口]錯誤在謂詞:TRANDATE =「(SELECT @dDateTIME)」「

+3

***什麼***是你得到的錯誤!?!?!?!?!?我們無法閱讀你的屏幕 - 也沒有你的想法....你將不得不**,告訴我們** ...而當你在這裏 - 也請告訴我們***什麼數據庫* **你正在使用(和哪個版本); SQL只是查詢語言 - 不是數據庫產品.... –

+0

我正在使用的數據庫是SQL Server 2008 r2 dsn連接到的數據庫是Pervasive 我知道錯誤是由我使用的語法引起的當通過該變量時。如果我在WHERE語句中輸入datevalue,它就可以正常工作。 (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