当我运行此代码时,我没有错误:
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服务器。我没有简化查询,因为错误消息表明它是语法错误。
编辑:
要明确:
当EXEC('SELECT * INTO GT_Item FROM OPENQUERY(PLPPROD_LS, ''' + @SQL + ''')' )
设置为许多其他内容时,@SQL
有效,包括但不限于SELECT ITEM_CODE AS GT_ITEM_CODE, ITEMC_CODE, ITEM_DESC, VALID_CODE_PROD FROM ITEM
。但是,上面列出的带有CASE
语句的字符串只有在我不使用EXEC
时才会执行,而是如图所示写入。
EDIT2:找到解决方案,需要双重转义@SQL字符串中的'
。不知道为什么会这样,但是用''
替换''''
让EXEC运行,并且没有在我的决赛桌中留下额外的'
。
答案 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'