2015-08-26 34 views
0

當我運行這段代碼我沒有得到任何錯誤:SQL Server的OPENQUERY無效語法EXEC只有

SELECT * INTO GT_Item 
FROM OPENQUERY(PLPPROD_LS, 
     'SELECT 
      ITEM_CODE AS GT_ITEM_CODE, ITEMC_CODE, ITEM_DESC, 
      VALID_CODE_PROD, 
      CASE 
       WHEN ITEMC_CODE LIKE ''WIP%'' 
        THEN ''WIP-''||(SELECT MAX(JOBOP.JOB_NO)||''-''||MAX(OPCLASS_CODE) FROM REC INNER JOIN JOBOP ON JOBOP.JOBOP_ID = REC.JOBOP_ID WHERE REC.ITEM_CODE = ITEM.ITEM_CODE) 
        ELSE ITEM_CODE 
      END AS GALAXY_ITEM_CODE 
     FROM ITEM') 

但是,當我設置@sql NVARCHAR(2000)等於openquery串並嘗試運行

DECLARE @SQL NVARCHAR(MAX) = N'SELECT ITEM_CODE AS GT_ITEM_CODE, ITEMC_CODE, ITEM_DESC, VALID_CODE_PROD, CASE WHEN ITEMC_CODE LIKE ''WIP%'' THEN ''WIP-''||(SELECT MAX(JOBOP.JOB_NO)||''-''||MAX(OPCLASS_CODE) FROM REC INNER JOIN JOBOP ON JOBOP.JOBOP_ID = REC.JOBOP_ID WHERE REC.ITEM_CODE = ITEM.ITEM_CODE) ELSE ITEM_CODE END AS GALAXY_ITEM_CODE FROM ITEM' EXEC('SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, ''' + @SQL + ''')')

我收到一個無效的語法錯誤,指向字符串的''WIP%''部分。此外,如果我將該條件更改爲另一條(例如ITEMC_CODE IN ('WIP_PRT','WIP_LAM')),我會在同一部分獲得相同的錯誤。

爲什麼我在運行代碼時出現錯誤而不是另一種?我在同一存儲過程中的其他查詢以第二種方式執行,沒有問題。

鏈接的服務器是一個Oracle 11服務器。我沒有簡化查詢,因爲錯誤消息表明它是一個語法錯誤。

編輯:當@SQL設置爲許多其他事情,包括但不限於SELECT ITEM_CODE AS GT_ITEM_CODE, ITEMC_CODE, ITEM_DESC, VALID_CODE_PROD FROM ITEM EXEC('SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, ''' + @SQL + ''')')作品:

予以明確。但是,如果我不使用EXEC,而是按照所示方式將其寫入,則上面列出的帶有CASE語句的字符串將僅執行。

EDIT2:找到解決方案,需要在@SQL字符串中雙重轉義'。不知道這是爲什麼,但用''''替換''讓EXEC運行,並沒有在我的決賽桌上留下額外的'

+0

但它不是一個語法錯誤本身..如果我have' @ SQL = SELECT * FROM ITEM'運行良好...... –

+0

不,它不需要,要去嘗試回答的第二部分 –

回答

0

正確方法不依賴於級聯和多''和使用參數,而不是:

DECLARE @query NVARCHAR(MAX) = N'SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, ''@SQL'')', 
     @param_list NVARCHAR(MAX) = N'@SQL NVARCHAR(MAX)'; 

EXEC [dbo].[sp_executesql] 
     @query, 
     @param_list, 
     @SQL; 

編輯:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT ''WIP-''||ITEM_CODE AS TEST FROM ITEM' 

DECLARE @query NVARCHAR(MAX) = 'SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, ''' + @SQL + ''')' 
SELECT @query 

Result: 
SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, 'SELECT 'WIP-'||ITEM_CODE AS TEST FROM ITEM') 

結果不正確,因爲它缺少''附近WIP

正確的查詢:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT ''''WIP-''''||ITEM_CODE AS TEST FROM ITEM' 
+0

@AdamMartin查看已更新的答案 – lad2025

+0

這兩種解決方案都不起作用。第一個語法錯誤相同,第二個在@SQL中有語法錯誤。澄清問題 –

+0

@AdamMartin編輯你的問題,並添加'DECLARE @SQL NVARCHAR(MAX)= ....',我需要看到確切的字符串。添加不寫不工作,但也分享錯誤信息。 – lad2025