有没有一种简单的方法可以将数据库SQL脚本文件分解为每个对象一个文件?

时间:2010-11-22 15:46:50

标签: database powershell sql-scripts

我有SQL Servers任务的输出 - >为一个文件中的数据库中的所有表生成脚本...

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

显然,如果我可以选择“每个对象的文件数”设置来运行“生成脚本”任务,我就不会问这个。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 = [regex]::Replace($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.     $line | Out-file -FilePath table.sql -Append
13.  }
14.  Move-Item -LiteralPath "table.sql" -Destination $outFile

更改第2行,了解您当前拥有的任何组合sql文件和第9行,以查找适合您的脚本的任何数据库名称。

以下是我用于测试的“test.sql”文件的示例。

USE [dbaInventory]
GO

/****** Object:  Table [dbo].[tableOne]    Script Date: 11/22/2010 12:28:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[tableOne](
    [colA] [smallint] NULL,
    [colB] [char](1) NULL,
    [colC] [decimal](10, 2) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

USE [dbaInventory]
GO

/****** Object:  Table [dbo].[tableTwo]    Script Date: 11/22/2010 12:28:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[tableTwo](
    [col_A] [char](1) NULL,
    [col_B] [decimal](10, 2) NULL,
    [col_C] [smallint] NULL,
 CONSTRAINT [Pk_tableTwo] PRIMARY KEY CLUSTERED 
(
    [col_A] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
相关问题