仅EXEC中的SQL Server OpenQuery无效语法

时间:2015-08-26 19:23:07

标签: sql-server oracle11g

当我运行此代码时,我没有错误:

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运行,并且没有在我的决赛桌中留下额外的'

1 个答案:

答案 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'