在 openquery 中传递一个 table 作为参数

Pass a table as parameter in openquery

我创建了一个数据类型并声明了一个 table 这种类型,我打算将其作为参数传递给 OPENQUERY 语句。 OPENQUERY returns 对象没有列的错误。
首先,table参数定义如下:

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 

数据 table returns 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 子句将填充 table 的 select 语句转换为视图,然后将视图加入 [=13],而不是使用 table 变量=] 在远程服务器上。

table 变量不能作为参数传递给 OPENQUERY。由于我的 table 只有一列,所以我能够将其转换为字符串并将该字符串作为参数传递给 OPENQUERY。我在接受 table 变量的过程中完成了此操作。将 table 解析为字符串后,该过程还会运行 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