當我運行這段代碼我沒有得到任何錯誤: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運行,並沒有在我的決賽桌上留下額外的'
。
但它不是一個語法錯誤本身..如果我have' @ SQL = SELECT * FROM ITEM'運行良好...... –
不,它不需要,要去嘗試回答的第二部分 –