SQL Server中的Openquery语句

时间:2014-10-14 16:20:36

标签: sql sql-server tsql openquery

我对SQL很新,我希望有人可以帮助我解决我遇到的问题。我找不到任何答案,帮助我找出这个确切的问题。

我在两个不同服务器上的两个SQL Server数据库中有两个表,我想使用列ItemID进行比较。我想从Table1中找到具有Table2中不存在的ItemID的记录,并将它们插入到表变量中。我有以下代码:

--Create table variable to hold query results 
DECLARE @ItemIDTable TABLE 
  ( 
     [itemid][NVARCHAR](20) NULL 
  ); 

--Query data and insert results into table variable  
INSERT INTO @ItemIDTable 
            ([itemid]) 
SELECT a.[itemid] 
FROM   database1.dbo.table1 a 
WHERE  NOT EXISTS (SELECT 1 
                   FROM   [Database2].[dbo].[table2] 
                   WHERE  a.itemid = [Database2].[dbo].[table2].[itemid]) 
ORDER  BY itemid 

这适用于测试服务器,其中两个数据库位于同一服务器上,但不在现实生活中,它们位于不同的服务器上。我使用OPENQUERY尝试了以下操作,但我知道我没有完全正确。

--Create table variable to hold query results
DECLARE @ItemIDTable TABLE
    (
    [ItemID][nvarchar](20) NULL
    );

--Query data and insert results into table variable 
INSERT INTO @ItemIDTable
    ([ItemID])
    SELECT a.[ItemID]
    FROM  Database1.dbo.Table1 a 
    WHERE NOT EXISTS (SELECT 1 
                      FROM OPENQUERY([Server2], SELECT * FROM [Database2].[dbo].[Table2]') 
                      WHERE a.ItemID = [Database2].[dbo].[Table2].[ItemID])
    ORDER BY ItemID

我很确定我需要在WHERE子句中做一些事情,我在两台服务器上有两个数据库,我只是不太确定如何构建它。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

Openquery的工作原理如下:

select * 
from openquery
(LINKED_SERVER_NAME,
'select query goes here'
)

请注意,sql部分是单引号。这意味着如果有必要,您可能需要引用引号。例如:

select * 
from openquery
(LINKED_SERVER_NAME,
'
select SomeTextField
from SomeTable
where SomeDateField = ''20141014''
'
)

答案 1 :(得分:1)

您无法创建与外部查询相关的OPENQUERY。您可以使用OPENQUERY的结果填充临时表,并对临时表执行WHERE NOT EXISTS,或者您可能希望查看Synonyms