我在一个文件中为我的数据库中的所有表输出了 SQL Servers Tasks -> Generate Scripts...。
有没有一种简单的方法可以将单个 SQL 脚本分解为每个表一个文件?
显然,如果我可以在选择 File per object 设置的情况下运行 Generate Scripts 任务,我就不会问这个问题了。
我在一个文件中为我的数据库中的所有表输出了 SQL Servers Tasks -> Generate Scripts...。
有没有一种简单的方法可以将单个 SQL 脚本分解为每个表一个文件?
显然,如果我可以在选择 File per object 设置的情况下运行 Generate Scripts 任务,我就不会问这个问题了。
运行任务-> 生成脚本任务。在最后的向导页面中选择“脚本到文件”并选择“每个对象的文件”。您必须为输出指定一个现有文件夹。
使用 PowerShell。在不知道您的 SQL 文件格式的情况下,这可能会或可能不会起作用。它至少应该给你一个起点。它开始写入“table.sql”文件,但后来将该文件重命名为tablename .sql
1. $lineNumber = 0
2. $inputFile = "test.sql"
3. foreach ($line in Get-Content $inputFile) {
4. if ($line -match "create table") {
5. $w = [正则表达式]::替换($line, "^.+\.\[(\w+)\].+$", '$1')
6. $outFile = "$w.sql"
7. $lineNumber = 1
8.}
9. if (($line -match "use \[dbaInventory\]") -and ($lineNumber -gt 0)) {
10. Move-Item -LiteralPath "table.sql" -Destination $outFile
11.}
12. $线 | 输出文件 -FilePath table.sql -Append
13.}
14. Move-Item -LiteralPath "table.sql" -Destination $outFile
更改您当前拥有的任何组合 sql 文件的第 2 行和第 9 行以查找适合您的脚本的任何数据库名称。
这是我用于测试的“test.sql”文件的示例。
使用 [dbaInventory]
去
/****** 对象:表 [dbo].[tableOne] 脚本日期:11/22/2010 12:28:55 ******/
设置 ANSI_NULLS ON
去
设置 QUOTED_IDENTIFIER ON
去
设置 ANSI_PADDING ON
去
创建表 [dbo].[tableOne](
[colA] [smallint] NULL,
[colB] [char](1) 空值,
[colC] [十进制](10, 2) NULL
) 开 [主要]
去
设置 ANSI_PADDING 关闭
去
使用 [dbaInventory]
去
/****** 对象:表 [dbo].[tableTwo] 脚本日期:11/22/2010 12:28:55 ******/
设置 ANSI_NULLS ON
去
设置 QUOTED_IDENTIFIER ON
去
设置 ANSI_PADDING ON
去
创建表 [dbo].[tableTwo](
[col_A] [char](1) 空值,
[col_B] [十进制](10, 2) NULL,
[col_C] [smallint] NULL,
约束 [Pk_tableTwo] 主键集群
(
[col_A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) 开 [主要]
去
设置 ANSI_PADDING 关闭
去