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 的临时表中的结果。
这样对吗?
感谢您的帮助。
在指定的链接服务器上执行指定的传递查询。此服务器是 OLE DB 数据源。
OPENQUERY可以在查询的 FROM 子句中引用,就像它是表名一样。OPENQUERY也可以作为一个目标表中引用INSERT,UPDATE或DELETE声明。这取决于 OLE DB 提供程序的功能。虽然查询可能返回多个结果集,但OPENQUERY只返回第一个。参数
linked_server
是表示链接服务器名称的标识符。' query '
是在链接服务器中执行的查询字符串。字符串的最大长度为 8 KB。
因此,要回答您的问题,是的,这就是您的查询正在做的事情。在您的情况下,linked_serverSRV_TimeTac的值是,' query '的值是您的长文字字符串。' query '的值在链接服务器上运行,结果集返回到您运行的服务器OPENQUERY。然后将该结果集插入到变量中@ttaAllocs。
有趣的COMMIT是,您在 之前开始的事务INSERT,考虑到您只将值插入到变量中并且没有影响任何持久对象,这看起来很奇怪。表变量很可能最终被写入磁盘,而不是存储在内存中,如果它足够大,但是您很可能会将事务提交到tempdb.
| 归档时间: |
|
| 查看次数: |
2792 次 |
| 最近记录: |