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数据源进行远程访问的最佳实践解决方案,因为查询计划在本地缓存,因此这种远程访问将多次发生。