Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将链接服务器中特定列具有非空值的所有记录选择到本地数据库中_Sql_Sql Server - Fatal编程技术网

Sql 如何将链接服务器中特定列具有非空值的所有记录选择到本地数据库中

Sql 如何将链接服务器中特定列具有非空值的所有记录选择到本地数据库中,sql,sql-server,Sql,Sql Server,我有一个包含许多表的链接服务器。其中一些表包含一个名为exampleColumn的特定列。我想为example列选择链接服务器中具有非null值的所有记录。忽略所有不包含此列的表和包含此列空值的所有记录如果exampleColumn具有值,我希望选择包括所有其他列的整行 此外,我希望在本地服务器中创建表和列,以容纳与链接服务器中相同名称和数据类型的选定数据,而不创建没有记录的表 我在网上找到了许多资源,这些资源描述了如何根据特定的值从不同的数据库中进行选择,但我没有找到任何可以检查所有表而不是一

我有一个包含许多表的链接服务器。其中一些表包含一个名为exampleColumn的特定列。我想为example列选择链接服务器中具有非null值的所有记录。忽略所有不包含此列的表和包含此列空值的所有记录如果exampleColumn具有值,我希望选择包括所有其他列的整行

此外,我希望在本地服务器中创建表和列,以容纳与链接服务器中相同名称和数据类型的选定数据,而不创建没有记录的表


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

不完全确定您在这里想要什么,因为没有太多的细节,但非常确定您可以这样做。这将生成需要运行的所有insert语句。您可以将其粘贴到一个变量中并通过动态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
-编辑-

要仅为至少有一行且列不为null的远程表创建本地表,只需在select之前添加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

可以使用SELECT INTO创建带有SELECT语句的表。您需要查看sys.tables和sys.columns,以了解哪些表的列具有特定名称。然后使用动态sql和where子句。@seanRange挑战是动态创建我正在选择的表。正如我在问题中提到的。你知道怎么做吗?您能告诉我吗?您需要创建永久表来选择,还是可以使用临时表来保存和查看数据,直到您知道要插入的数据为止?如果您可以在链接服务器上拉取数据时使用临时表,则可以使用SELECT。。。进入TEMP FROM…@thermos我有创建临时表的权限,但最终结果应该是创建永久表,其中只包含该ExampleColumn具有非空值的记录这适用于从所有表中进行选择。非常感谢你。对于我问题的第二部分,您知道如何创建一个表和所需的列,因为它们位于链接服务器中以容纳所选数据吗?例如,如果LinkedServer…exampleTable具有exampleColumn列和20条具有非空值的记录,如何在本地数据库中使用链接服务器表具有的相同列创建此表?如果我的链接服务器有50个表,但其中只有20个表具有该列非空值的记录,那么我只希望在本地创建20个表。请原谅我在这里的经验不足,但这是否实际生成了创建表的sql语句?看起来它会检查它是否存在,然后选择它。如果该表不存在,我需要使用链接服务器中该表的元数据创建该表。选择INTO将创建目标表。如果表存在,则不能使用该语法。你可以在《刚刚弄明白》中读到关于INTO子句的内容。您已经从[LinkServer].[Database].[Schema].[when I real needed]从[LinkServer].[Database].dbo]获得了“when I real needed”。这生成了一条sql语句,它完全满足了我的需要。非常感谢你的帮助。很高兴你的帮助。要知道dbo是模式,它只是默认模式。
if exists (select 1 from [linkedserver].[db].[schema].[tableX]) begin

select *
into [schema].[tableX]
from [linkedserver].[db].[schema].[tableX]

end;