微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 openquery

如何解决在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?