1

我在一个文件中为我的数据库中的所有表输出了 SQL Servers Tasks -> Generate Scripts...。

有没有一种简单的方法可以将单个 SQL 脚本分解为每个表一个文件?

显然,如果我可以在选择 File per object 设置的情况下运行 Generate Scripts 任务,我就不会问这个问题了。

4

2 回答 2

2

运行任务-> 生成脚本任务。在最后的向导页面中选择“脚本到文件”并选择“每个对象的文件”。您必须为输出指定一个现有文件夹。

于 2010-11-22T15:56:30.690 回答
0

使用 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 关闭
去
于 2010-11-22T19:45:09.280 回答