在这篇文章中,我们将学习OPENQUERY函数。它用于使用链接服务器在远程数据源上运行一个临时的分布式查询。有各种方法来查询远程数据源。它也被用来执行直通式查询,在链接服务器中配置的数据库的表中运行INSERT、UPDATE和DELETE语句。
重要说明。
OPENQUERY函数的语法如下。
SELECT * FROM OPENQUERY (linkedServer, ‘Query’)
OPENQUERY函数被用在FROM子句之后。在语法上。
LinkedServer:指定你要执行查询的链接服务器的名称。
查询:指定你想在链接服务器上执行的T-SQL查询。查询字符串的最大长度为8KB。
为了演示OPENQUERY的用法,我在工作站上安装了SQL Server 2019和PostgreSQL13。我已经创建了两个链接服务器。第一台链接服务器连接到远程SQL Server实例。它被命名为Nisarg-PC\SQL01。
第二个链接服务器名为PostgreSQL30,用于连接到PostgreSQL数据库。我已经使用ODBC驱动程序配置了名为PostgreSQL30的DSN(数据源名称)。链接服务器使用这个DSN来访问UKLandRegistery数据库。要查看链接服务器的列表,请执行以下查询。
use master
select srvid,srvstatus, srvname,srvproduct,datasource,schemadate,catalog from sys.sysservers
现在,让我们看看一些例子
例1:运行选择语句
为了在SQL服务器上运行SELECT语句,我们将使用名为Nisarg-PC\SQL01的链接服务器。下面的查询从StackOverflow2010数据库中填充数据。
select * from openquery([NISARG-PC\SQL01],'select top 100 AboutMe, Age,CreationDate,DisplayName,Views,WebsiteURL from StackOverflow2010.dbo.Users')
为了在PostgreSQL中运行SELECT语句,我们将使用名为PostgreSQL30的链接服务器。下面的查询从UKLandRegistery数据库中填充数据。
select * from openquery([POSTGRESQL30],'select price, transfer_date, property_type,locality,city,district,county from land_registry_price_paid_uk limit 100')
例2:在本地表中插入数据
在这个例子中,我们将学习如何插入从远程源弹出的数据并将其插入本地表。我已经创建了一个名为openQueryDemo的数据库。在openQueryDemo数据库中,我已经创建了两个表,名为tbl_land_registry_price_paid_uk和tblUsers。tbl_land_registry_price_paid_uk表的定义如下。
CREATE TABLE land_registry_price_paid_uk
price integer,
transfer_date date,
property_type varchar(1),
locality varchar(5000) ,
city varchar(5000) ,
district varchar(5000) ,
county varchar(5000)
tblUsers表的定义如下。
CREATE TABLE [Users]
[Id] [int] IDENTITY(1,1) NOT NULL,
[AboutMe] [nvarchar](max) NULL,
[Age] [int] NULL,
[CreationDate] [datetime] NOT NULL,
[DisplayName] [nvarchar](40) NOT NULL,
[Views] [int] NOT NULL,
[WebsiteUrl] [nvarchar](200) NULL,
现在,我们要将land_registry_price_paid_uk表的数据插入到tbl_land_registry_price_paid_uk中。 要做到这一点,请运行下面的查询。
insert into land_registry_price_paid_uk (price, transfer_date, property_type,locality,city,district,county)
select * from openquery([POSTGRESQL30],'select price, transfer_date, property_type,locality,city,district,county from land_registry_price_paid_uk limit 100')
上面的查询从PostgreSQL数据库中创建的表中填充数据,并将其插入到SQL Server中创建的表中。
同样地,我们要把**[dbo].[Users**]表的数据插入到**[dbo][tblUsers]中。** 要做到这一点,请运行以下查询。
insert into [Users] (AboutMe, Age,CreationDate,DisplayName,Views,WebsiteURL)
select * from openquery([NISARG-PC\SQL01],'select top 100 AboutMe, Age,CreationDate,DisplayName,Views,WebsiteURL from StackOverflow2010.dbo.Users')
上面的查询从远程SQL Server数据库中创建的表中填充数据,并将其插入到SQL Server中创建的表中。
例3:执行DML语句
在这个例子中,我们将学习如何使用OPENQUERY从远程服务器插入、UPDATE和DELETE数据。我已经创建了两个表。
tblSchool:这个表是在一个远程PostgreSQL数据库中创建的。创建表的定义如下。
CREATE TABLE public."tblSchool"
"School_ID" integer NOT NULL,
"School_Name" character varying(5000) COLLATE pg_catalog."default",
CONSTRAINT "tblSchool_pkey" PRIMARY KEY ("School_ID")
tblStudent:这个表是在一个远程SQL Server数据库中创建的。创建表的定义如下。
create table tblStudent
(ID int identity(1,1) primary key,
student_name varchar(500),
grade char(1),
school_id int
现在,首先,让我们在tblStudent表中插入数据。要做到这一点,请运行以下查询。
INSERT OPENQUERY ([NISARG-PC\SQL01], 'SELECT student_name, grade,school_id from StackOverflow2010.dbo.tblstudent')
VALUES ('Nisarg Upadhyay','A',01);
现在,运行下面的查询来改变学生的名字。
UPDATE OPENQUERY ([NISARG-PC\SQL01], 'SELECT student_name, grade,school_id from StackOverflow2010.dbo.tblstudent where ID=01')
SET student_name = 'Nisarg Dixitkumar Upadhyay';
查询输出。
现在,运行以下查询,从表中删除该记录。
DELETE OPENQUERY ([NISARG-PC\SQL01], 'SELECT student_name, grade,school_id from StackOverflow2010.dbo.tblstudent where ID=01')
现在,让我们使用OPENQUERY在PostgreSQL数据库中运行同样的查询。要在tblSchool表中插入数据,运行以下查询。
INSERT OPENQUERY ([POSTGRESQL30], 'SELECT "School_ID","School_Name" FROM public."tblSchool"')
VALUES (03,'Karvey School');
查询输出。
现在,运行下面的查询来改变学校的名称。
UPDATE OPENQUERY ([POSTGRESQL30], 'SELECT "School_ID","School_Name" FROM public."tblSchool" where "School_ID"=01')
SET School_Name = 'Nalanda High School';
查询输出。
现在,运行下面的查询,从tblSchool表中删除该学校的记录。
DELETE OPENQUERY ([POSTGRESQL30], 'SELECT "School_ID","School_Name" FROM public."tblSchool" where "School_ID"=01')
查询输出。
在这篇文章中,我们了解了OPENQUERY函数和它的用法。我通过在PostgreSQL和远程SQL Server实例上执行查询来解释这个概念。