使用查询从 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 文件