使用查询从 Microsoft SQL Server 导出数据到目标数据

Posted

技术标签:

【中文标题】使用查询从 Microsoft SQL Server 导出数据到目标数据【英文标题】:Export data from Microsoft SQL Server using a query to target data 【发布时间】:2019-09-04 13:39:56 【问题描述】:

我知道如何为脚本插入行生成脚本,以便我备份一些数据。我想知道是否可以编写一个查询(以 WHERE 子句为例)来定位一个非常大的表中的一个非常小的数据子集?

最后我想生成一个包含一堆插入行的脚本,并允许插入主键值(通常不允许你插入的地方)。

【问题讨论】:

你到底在问什么?如果您知道如何为所有行生成脚本,为什么不只使用其中的一个子集,或者更改您用来为所有行生成脚本的过程。你还没有告诉我们如何你是这样做的,那么我们如何解释如何改变这个过程? 抱歉,我以为只有一种方法可以“生成脚本”。我知道如何在MS SQL Server Management Studio 中使用它的唯一方法是Tasks>Generate Scripts。据我所知,没有“使用其中的一个子集”的选项。不管我是怎么做的,尽管我的最终目标(最后一句话)是相同的,并且我需要指导。谢谢! 【参考方案1】:

SSMS 不允许您对表中的特定行进行 INSERT 查询。您可以使用GenerateInsert 存储过程来执行此操作。例如:

EXECUTE dbo.GenerateInsert @ObjectName = N'YourTableName'
,@SearchCondition='[ColumnName]=ColumnValue';

将为您在@SearchCondition 中指定的过滤行提供类似的结果

假设您的表名是Table1,其中有列Salary & Name,并且您希望插入查询那些工资大于1000且名称以Mr.开头的人,那么您可以使用它:

EXECUTE dbo.GenerateInsert @ObjectName = N'Table1'
,@SearchCondition='[Salary]>1000 AND [Name] LIKE ''Mr.%'''
,@PopulateIdentityColumn=1;

【讨论】:

我会试一试,看看它是否符合我的要求,谢谢 MD。尽管您的示例似乎令人困惑。我不确定我可以在变量@SearchCondition 中添加什么。你能举个例子吗?谢谢! 啊!!现在我懂了!我期待着做别的事情。我想这就是您将变量传递给存储过程的方式。每天学些新东西。 ;) 最后一个问题,它可以处理多个条件吗?我有大约 5 个我需要申请。这可以作为一个例子吗? EXECUTE dbo.GenerateInsert @ObjectName = N'Table1', @SearchCondition='[Salary]>1000 AND [Name] LIKE "Mr.%"'; 就此而言,我将如何使用引号?我的双引号是正确的方法吗? 是的,它像您一样支持多种条件。对于引号,不要使用双引号,只需在每一侧添加一个额外的单引号,例如AND [Name] LIKE ''Mr.%'' 我总是在投票之前验证答案是否有效(我已经完成了)或将其标记为已回答。我一完成检查就会给你那个绿色的复选标记。 ;) - 最后一件事。根据我最初的问题,我还需要inserting primary key values,就像@SchmitzIT 所说的SET IDENTITY_INSERT Table1 ON 一样。这也可以解释吗?目前它只是忽略了我的主键列。【参考方案2】:

如果我正确地阅读了您的要求,那么您实际上想要做的只是复制表中的一些数据。我通常使用SELECT INTO 来做到这一点。这也会为您生成目标表。

CREATE TABLE myTable (Column1 int, column2 NVARCHAR(50))
;
INSERT INTO myTable VALUES (1, 'abc'), (2, 'bcd'), (3, 'cde'), (4, 'def')
;
SELECT * FROM myTable
;
SELECT 
    *
INTO myTable2
FROM myTable WHERE Column1 > 2
;

SELECT * FROM myTable;
SELECT * FROM myTable2;

DROP TABLE myTable;
DROP TABLE myTable2;

myTable 将包含以下内容:

Column1 column2
1   abc
2   bcd
3   cde
4   def

myTable2 将只有最后 2 行:

Column1 column2
3   cde
4   def

编辑:刚刚看到有关主键值的信息。这是否意味着您想要将数据插入到现有表中,而不仅仅是创建备份集?如果是这样,您可以发出 SET IDENTITY_INSERT myTable2 ON 以允许这样做。

但是,请注意,如果您尝试插入的 id 值已经存在,这可能会导致问题。

【讨论】:

感谢 SchmitzIT,回答您的最后一个问题 (SET IDENTITY_INSERT myTable2 ON),这正是我所说的。我将使用它来将数据从一个数据库恢复到另一个数据库。 src DB 是旧备份,dest 是错误更改的 DB。因此,ID 根本不会成为问题,因为它们不再存在于 dest 数据库中。至于(我认为的)解决方法来做我想做的事情,我希望有一种简单的方法可以使用创建脚本的正常方法,但在 SRC 结果中添加WHERE。不过感谢您的解决方案! @ArvoBowen 目标表是否需要 ID?通常,标识列的目的是保证标识记录的唯一方式。 ID 本身不应该是添加任何形式的业务逻辑的手段(这就是自然键的用途)。 在大多数情况下,ID 还用于链接其他表中的数据。比如我的情况。在我的情况下,ID 非常重要。 @ArvoBowen - 这很公平:)

以上是关于使用查询从 Microsoft SQL Server 导出数据到目标数据的主要内容,如果未能解决你的问题,请参考以下文章

使用查询从 Microsoft SQL Server 导出数据到目标数据

SQL serve 2008 r2安装失败,为啥?怎么办才好!!!!急急急!!!!

Microsoft Access 使用 Access 中的 SQL 查询合并两个 Excel 文件

sql serve创建存储过程,查询指定学生的学号、姓名、课程名、成绩

sql serve数据库中对in查询到的数据排序

Microsoft SQL Server 从选择查询插入