Sql server 将正确格式的参数传递到链接服务器

Sql server 将正确格式的参数传递到链接服务器,sql-server,tsql,linked-server,Sql Server,Tsql,Linked Server,我将参数传递到链接服务器,如下所示: DECLARE @QRY01 VARCHAR(8000) ,@WIP_PRM VARCHAR(12) --START SEARCHING WIP_AUTO_KEY IN COST_AUDIT_LOG FROM LAST RECORD INCLUDED IN tbl_WIPLOG1 SET @WIP_PRM = CONVERT(VARCHAR(12),(SELECT MAX(WIP_AUTO_KEY) FROM tbl_WIPLOG1)) SE

我将参数传递到链接服务器,如下所示:

DECLARE 
 @QRY01 VARCHAR(8000)
,@WIP_PRM VARCHAR(12)
--START SEARCHING WIP_AUTO_KEY IN COST_AUDIT_LOG FROM LAST RECORD INCLUDED IN tbl_WIPLOG1
SET @WIP_PRM = CONVERT(VARCHAR(12),(SELECT MAX(WIP_AUTO_KEY)  FROM tbl_WIPLOG1))

    SET @QRY01 = ' 
    SELECT  * 
    FROM
    OPENQUERY(LINKED_SERVER,
    ''SELECT DISTINCT
     QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY
    ,QCTL.WIP_AUDIT_LOG.WOO_AUTO_KEY
    FROM QCTL.WIP_AUDIT_LOG 
    WHERE
    QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY > '+CHAR(39) + CHAR(39)+CAST(@WIP_PRM AS nvarchar(500))+CHAR(39) + CHAR(39)+N''')

    EXEC(@QRY01)
OPENQUERY语句中参数的格式似乎不正确,或者需要在前面加一个关键字将其指定为文本,因为整个语句都包含在括号中。如果我按如下所示在中键入参数值,则查询有效,但不是按上述格式

 SET @QRY01 = ' 
    SELECT  * 
    FROM
    OPENQUERY(LINKED_SERVER,
    ''SELECT DISTINCT
     QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY
    ,QCTL.WIP_AUDIT_LOG.WOO_AUTO_KEY
    FROM QCTL.WIP_AUDIT_LOG 
    WHERE
    QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY > ''''1432697'''' '

EXEC(@QRY01)

如何使查询接受正确格式的参数?

@leon,您需要去掉字符(39)以简化查询

以下是修改后的版本:

    DECLARE 
     @QRY01 VARCHAR(8000)
    ,@WIP_PRM VARCHAR(12)
    --START SEARCHING WIP_AUTO_KEY IN COST_AUDIT_LOG FROM LAST RECORD INCLUDED IN tbl_WIPLOG1
    SET @WIP_PRM = CONVERT(VARCHAR(12),(SELECT MAX(WIP_AUTO_KEY)  FROM tbl_WIPLOG1))

        SET @QRY01 = ' 
        SELECT  * 
        FROM
        OPENQUERY(LINKED_SERVER,
        ''SELECT DISTINCT
         QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY
        ,QCTL.WIP_AUDIT_LOG.WOO_AUTO_KEY
        FROM QCTL.WIP_AUDIT_LOG 
        WHERE
      QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY > '+CAST(@WIP_PRM AS nvarchar(500))+ N''')'

EXEC(@QRY01)
这将为您提供以下输出:

    SELECT  * 
    FROM
    OPENQUERY(LINKED_SERVER,
    'SELECT DISTINCT
     QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY
    ,QCTL.WIP_AUDIT_LOG.WOO_AUTO_KEY
    FROM QCTL.WIP_AUDIT_LOG 
    WHERE
  QCTL.WIP_AUDIT_LOG.WIP_AUTO_KEY > 1432697')

您不需要
exec
sp_executesql
对链接服务器运行查询。您可以在
FROM
子句中指定服务器,例如
FROM LINKED_server.ThatDatabase.QCTL.WIP_AUDIT_LOG…
执行
打印@QRY01
并检查似乎不起作用的查询-消息“无效对象名称”不
从LINKED_server.master.sys.databases中选择[name]返回什么?如果没有,,
OPENQUERY
不起作用,因为您没有将
LINKED\u SERVER
配置为链接服务器。链接服务器的作用是使您能够在链接服务器上运行sql语句,而不必使用
OPENQUERY
之类的东西-您只需要为数据库对象提供一个完全限定的名称-Server.Database.Schema.Table/Procedure/view对链接服务器运行查询不需要OPENQUERY。如果参数甚至包含一个意外值,如“
或“.”,字符串连接将失败。SQL注入攻击就是这样进行的out@PanagiotisKanavos,我不确定你的说法是否正确。实际上,您需要OPENQUERY。Openquery帮助“在指定的链接服务器上执行指定的传递查询”。不,你没有。您需要为表使用由四部分组成的名称。您的链接指向OPENQUERY文档,而不是链接服务器的特定内容它们都是有效的。Openquery是另一个选项。参考文献:我同意这是有后果的。复制:OPENQUERY函数和四部分名称之间的最大区别在于所使用的资源。当使用OPENQUERY时,将创建查询计划并在远程服务器中使用,只将结果集中的行带入。否则,使用四部分名称将在本地处理查询。使用由四部分组成的名称是从OLE DB数据源进行远程访问的最佳实践解决方案,因为查询计划在本地缓存,因此这种远程访问将多次发生。