首页 > 解决方案 > 如何将链接服务器中对特定列具有非空值的所有记录选择到本地数据库中

问题描述

我有一个包含许多表的链接服务器。其中一些表包含名为 exampleColumn 的特定列。我想选择链接服务器中对于 exampleColumn 具有非空值的所有记录。(忽略所有没有该列的表以及该列具有空值的所有记录)如果 exampleColumn 有值,我想选择包括所有其他列的整行。

此外,我想在本地服务器中创建表和列,以容纳与链接服务器中具有相同名称和数据类型的选定数据(不创建不会带来任何记录的表)

我在网上找到了许多资源,这些资源描述了如何根据特定值从不同的数据库中进行选择,但我还没有找到任何可以检查所有表而不仅仅是一个表的资源。我也找不到任何关于基于选择源动态创建表/列的内容。

标签: sqlsql-server

解决方案


不完全确定你想要什么,因为细节不多,但很确定你可以做这样的事情。这将生成您需要运行的所有插入语句。您可以将其粘贴到变量中并通过动态 sql 执行它,或者只需复制并粘贴即可运行它。也不确定与您正在运行的查询相关的链接服务器在哪里。

declare @ColumnName sysname = 'exampleColumn'

select 'select * into ' + quotename(object_name(object_id)) + ' from [LinkServer].[Database].[Schema].' + quotename(object_name(object_id)) + ' where ' + QUOTENAME(@ColumnName) + ' is not null;'
from sys.columns
where name = @ColumnName

- 编辑 -

要仅为至少有一行不为空的远程表创建本地表,只需在选择之前添加 EXISTS。像这样。

select 'IF EXISTS(select * from [LinkServer].[Database].[Schema].' + quotename(object_name(object_id)) + ' where ' + QUOTENAME(@ColumnName) + ' is not null) select * into ' + quotename(object_name(object_id)) + ' from [LinkServer].[Database].[Schema].' + quotename(object_name(object_id)) + ' where ' + QUOTENAME(@ColumnName) + ' is not null;'
from sys.columns
where name = @ColumnName

推荐阅读