如何解决在 openquery
我已经创建了一个数据类型并声明了一个这种类型的表,我打算将它作为参数传递给 OPENQUERY 语句。 OPENQUERY
返回对象没有列的错误。
首先,表参数定义如下:
CREATE TYPE LooseTimecardsTableType AS TABLE ([LABORKEY] [float] NULL)
GO
DECLARE @DataTable AS LooseTimecardsTableType
INSERT INTO @DataTable
SELECT disTINCT WOBase.LABORKEY
FROM Lab_WO_DataWH AS WOBase
left outer JOIN Lab_hrs_DataWH LabHrsWH ON LabHrsWH.WORKORDERLABORKEY = WOBase.LABORKEY
WHERE LabHrsWH.WORKORDERLABORKEY IS NULL AND WOBase.LABORKEY IS NOT NULL AND WOBase.LABORPRICE <> 0
数据表返回一列 LABORKEY
,我想用它来限制来自 OPENQUERY
的记录数。这反过来定义如下:
DECLARE @sqlString NVARCHAR(500),@TableVariable LooseTimecardsTableType
SET @sqlString = N'SELECT * FROM OPENQUERY(Remoteserver,''SELECT disTINCT
DA.USERNAME,DA.WORKORDERLABORKEY,LB.PERFORMEDBY
FROM
REMOTE.WORKORDERDETAILAUDITS DA
JOIN REMOTE.WORKORDERLABORBASE LB ON LB.LABORKEY = DA.WORKORDERLABORKEY
JOIN @TableVariable ON @TableVariable.LABORKEY = LB.LABORKEY
WHERE DA.WORKORDERAUDITCATEGORY = 0'')'
EXECUTE sp_executesql @sqlString,N'@TableVariable LooseTimecardsTableType READONLY',@DataTable
请协助完成这项工作
解决方法
您可以使用 where 子句将填充表的 select 语句转换为视图,然后将视图连接到远程服务器上的表,而不是使用表变量。
,表变量不能作为参数传递给 OPENQUERY。由于我的表只有一列,因此我能够将其转换为字符串并将该字符串作为参数传递给 OPENQUERY。我在接受表变量的过程中执行了此操作。将表解析为字符串后,该过程还运行 OPENQUERY。
CREATE PROCEDURE PRM_LIST ( @TableVariable LooseTimecardsTableType READONLY)
AS
DECLARE
@LBKY_NVAR NVARCHAR(2500),@POINTER INT,@SQLString NVARCHAR(max)
SELECT @POINTER = MIN(LABORKEY) FROM @TableVariable
WHILE @POINTER IS NOT NULL
BEGIN
SET @LBKY_NVAR = IIF(@LBKY_NVAR IS NULL,'('+''''+ CONVERT(VARCHAR,@POINTER) + '''',@LBKY_NVAR + ',' + ''''+ CONVERT(VARCHAR,@POINTER) + '''')
SELECT @POINTER = MIN(LABORKEY) FROM @TableVariable WHERE LABORKEY > @POINTER
END
SET @LBKY_NVAR = @LBKY_NVAR + ')'
SET @LBKY_NVAR = REPLACE(@LBKY_NVAR,'''','''''')
SET @SQLString =
N'SELECT * FROM OPENQUERY(REMOTE,''SELECT DISTINCT
DA.USERNAME,DA.WORKORDERLABORKEY,LB.PERFORMEDBY
FROM
REMOTE.WORKORDERDETAILAUDITS DA
JOIN REMOTE.WORKORDERLABORBASE LB ON LB.LABORKEY = DA.WORKORDERLABORKEY
WHERE DA.WORKORDERAUDITCATEGORY = 0
AND LB.LABORKEY IN '+CAST(@LBKY_NVAR AS nvarchar(2500))+ N'
'')'
EXEC (@SQLString)
GO
过程调用是:
EXECUTE PRM_LIST @DATATABLE
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。