我有SQL Servers任务的输出 - >为一个文件中的数据库中的所有表生成脚本...
是否有一种简单的方法可以将单个SQL脚本分解为每个表的一个文件?
显然,如果我可以选择“每个对象的文件数”设置来运行“生成脚本”任务,我就不会问这个。
答案 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