SQL Server:OPENQUERY 用简单的话(举例)

MrM*_*Mee 4 t-sql sql-server openquery

我是 SQL Server 的新手,我在这里偶然发现了这一点:

BEGIN TRANSACTION loadTTAllocations

    INSERT INTO @ttaAllocs
        SELECT 
            company_code AS CompanyId,
            job_number AS JobNo,
            ...
            is_blocked AS IsBlocked
        FROM 
            OPENQUERY([SRV_TimeTac], 
                       'SELECT DISTINCT 
                            job.individual_value_1 AS job_number,
                            job.individual_value_3 AS company_code,
                            ...
                            now() AS queryTimeStamp
                        FROM 
                            pm_altran.pm_tasks_subprojects AS taskCode
                        INNER JOIN 
                            pm_altran.pm_tasks_subprojects AS job
                                 ON job.id = taskCode.mother_id 
                                 AND job.is_done = 0
                                 AND NOT job.is_blocked
                        INNER JOIN 
                            pm_node_to_user AS n2u
                                 ON n2u.node_id = taskCode.id
                                 AND n2u.access = 1
                                 AND n2u.is_todo = 1
                        LEFT JOIN 
                            altran_pm_user_user_settings AS u
                                 ON u.administrators_id = n2u.user_id
                        WHERE 
                            taskCode.object_type = ''task''
                            AND taskCode.is_paid_non_working = 0
                            AND taskCode.id > 50');

    SET @rowCount = @@ROWCOUNT

    SET @eventDetails = 'End loadTTAllocations: ' + CAST(@rowCount as VARCHAR(10)) + ' rows affected';

    COMMIT TRANSACTION loadTTAllocations
Run Code Online (Sandbox Code Playgroud)

问题是OPENQUERY.

我从文档中了解到的基本上是,它只是在另一台服务器上的查询。在这种情况下,SRV_TimeTac?

所以在这个例子中,我们在另一个名为“SRV_TimeTac”的服务器上查询并返回最终加载到名为@ttaAllocs 的临时表中的结果。

这样对吗?

感谢您的帮助。

use*_*983 7

OPENQUERY (Transact-SQL) :

在指定的链接服务器上执行指定的传递查询。此服务器是 OLE DB 数据源。OPENQUERY可以在查询的 FROM 子句中引用,就像它是表名一样。 OPENQUERY也可以作为一个目标表中引用INSERTUPDATEDELETE声明。这取决于 OLE DB 提供程序的功能。虽然查询可能返回多个结果集,但OPENQUERY只返回第一个。

参数

linked_server
是表示链接服务器名称的标识符。

' query '
是在链接服务器中执行的查询字符串。字符串的最大长度为 8 KB。

因此,要回答您的问题,是的,这就是您的查询正在做的事情。在您的情况下,linked_serverSRV_TimeTac的值是,' query '的值是您的长文字字符串。' query '的值在链接服务器上运行,结果集返回到您运行的服务器OPENQUERY。然后将该结果集插入到变量中@ttaAllocs

有趣的COMMIT是,您在 之前开始的事务INSERT,考虑到您只将值插入到变量中并且没有影响任何持久对象,这看起来很奇怪。表变量很可能最终被写入磁盘,而不是存储在内存中,如果它足够大,但是您很可能会将事务提交到tempdb.