2012-05-30 31 views
0

我很少使用SQL Server,并且在专业环境中我保持清晰!我正在做一个宠物项目,但我在创建脚本时遇到了问题。数据脚本生成问题

我有一个在线数据库,我需要从中提取所有内容。我使用SQL Server Management Studio中的任务>生成脚本选项。以下是脚本创建一个INSERT语句的例子(我有这些刀片的1000个):

INSERT [dbo].[NewComics] ([NewComicId], [Title], [Subtitle], [ReleaseDate], [CollectionId]) VALUES (366, N'Hawk & Dove 1:                      ', N'First Strikes                      ', CAST(0x00009F6F00000000 AS DateTime), 248) 

我有两个问题与此:

(一)我想要去除所有的空白从两个标题元素 (b)我不想HEX日期 - 我要像2006-09-01(YYYY-MM-DD)的东西可读

INSERT [dbo].[NewComics] ([NewComicId], [Title], [Subtitle], [ReleaseDate], [CollectionId]) VALUES (366, N'Hawk & Dove 1:', N'First Strikes', '2006-09-01', 248) 

什么是改变的最快方法约3,000个插入语句修改为这种格式?

仅供参考 - 这是表的设计:提前

[NewComicId] [int] NOT NULL, 
[Title] [nchar](100) NOT NULL, 
[Subtitle] [nchar](100) NULL, 
[ReleaseDate] [datetime] NOT NULL, 
[CollectionId] [int] NOT NULL, 

谢谢!

+0

在哪里数据变?什么是SQL Server版本?版?你应该能够做到任务>导出数据,并将其转储到平面文件,Excel或一些其他连接 – swasheck

+0

我只想做一个下降,与上述要求整个数据库中创建SQL文件。我正在使用SQL Management Studio 2012. – Sniffer

+0

所以你说你想清理数据? – swasheck

回答

5

是的,生成脚本可悲脚本日期时间列作为CONVERT(binary_value,Datetime)。我会尽力为什么(或者更重要的是,如果有改变行为的方法)得到答案。我怀疑原因是为了避免在具有不同语言环境/区域设置等的不同计算机上运行脚本的任何问题。我不知道是否有办法改变发生的同时,但Management Studio不是只有脚本才能编写数据......您可以查看Red-Gate的SQL Data Compare等第三方产品。

如果它真的只有3000行,并且您打算在不同的服务器上运行生成的脚本,请停止使用该向导并执行此操作(乍一看,这看起来很可怕,但它会执行一些您想要的操作 - 输出一个脚本,准备好复制,粘贴和运行,具有格式良好且可读的日期,通过GO命令将批量插入到多行VALUES中,甚至在标题,副标题和collectionid中处理潜在的NULL值:

DECLARE @newtable SYSNAME = 'dbo.NewComics'; 

SET NOCOUNT ON; 

;WITH x AS (SELECT TOP (4000) s = '(' 
    + CONVERT(VARCHAR(12), NewComicId) + ',' 
    + COALESCE('N''' + REPLACE(RTRIM(Title), '''', '''''') + '''', 'NULL') + ',' 
    + COALESCE('N''' + REPLACE(RTRIM(SubTitle), '''', '''''') + '''', 'NULL') 
    + ', ''' + CONVERT(CHAR(8), ReleaseDate, 112) + ' ' 
    + CONVERT(CHAR(8), ReleaseDate, 108) + ''',' 
    + CONVERT(VARCHAR(12), COALESCE(CollectionId, 'NULL')) + ')', 
    rn = ROW_NUMBER() OVER (ORDER BY NewComicId) 
    FROM dbo.OldComics ORDER BY NewComicId 
), 
y AS 
(
SELECT [/*a*/] = 1, [/*b*/] = 'SET NOCOUNT ON; 
GO 
INSERT ' + @newtable + ' VALUES' 
UNION ALL 
SELECT 2, s = CASE WHEN rn > 1 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 1 AND 1000 
UNION ALL 
SELECT 3, 'GO' UNION ALL 
SELECT 4, s = CASE WHEN rn > 1001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 1001 AND 2000 
UNION ALL 
SELECT 5, 'GO' UNION ALL 
SELECT 6, s = CASE WHEN rn > 2001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 2001 AND 3000 
UNION ALL 
SELECT 7, 'GO' UNION ALL 
SELECT 8, s = CASE WHEN rn > 3001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 3001 AND 4000 
) 
SELECT [/*b*/] FROM y ORDER BY [/*a*/]; 

(如果您有3000或3001行,您可能必须使用它,或者如果您有超过4000个等等,请添加另外几个联合。)

如果你将数据移动到同一实例上不同的表或不同的数据库,使用@swasheck提供(并再次脚本,停止使用向导)。

您可能已经注意到这里有一个共同的趋势:如果您不喜欢在日期上输出的二进制格式,请停止使用生成脚本向导。

+0

太棒了! - 这正是我需要的,我可以一次又一次地使用它。非常感谢亚伦! – Sniffer

2

因此,如果这是我,我会做的是建立表结构在一个单独的数据库:

CREATE TABLE NewComics (
[NewComicId] [int] identity (0,1) NOT NULL, 
[Title] [nvarchar](100) NOT NULL, 
[Subtitle] [nvarchar](100) NULL, 
[ReleaseDate] [datetime] NOT NULL, 
[CollectionId] [int] NOT NULL 
); 

ALTER TABLE [NewComics] 
ADD CONSTRAINT PK_NewComicsID PRIMARY KEY; 

然后使用SQL清洁,像这样的数据:

INSERT INTO [NewDatabase].[dbo].[NewComics] (Title, Subtitle, ReleaseDate, CollectionID) 
SELECT 
    LTRIM(RTRIM(Title)) 
    , LTRIM(RTRIM(Subtitle)) 
    , CAST(ReleaseDate as Datetime) 
    , CollectionID 
FROM [OldDatabase].[dbo].[NewComics]; 

或者,您也可以使用同样的SELECT查询:

SELECT 
    NewComicID 
    , LTRIM(RTRIM(Title)) 
    , LTRIM(RTRIM(Subtitle)) 
    , CAST(ReleaseDate as Datetime) 
    , CollectionID 
FROM [OldDatabase].[dbo].[NewComics]; 

为源动力导入/导出数据任务(在您用于Generate Scripts的相同菜单中)。该服务器上的[OldDatabase]将是该服务器的源,并且该服务器上的[NewDatabase]将是目的地。确保您选中了所有身份插入的框。

+0

确定。这并没有真正的工作,但让我在那里的一部分!我不得不将[Title]和[Subtitle]更改为nvarchar,然后剥去空白空间!日期虽然仍以十六进制日期显示,而不是yyyy-mm-dd。有任何想法吗? – Sniffer

+0

哎呦。甚至没有注意到这一点。 NVARCHAR绝对是正确的选择。至于日期,“NewComics的SELECT ReleaseDate”的输出是什么?你确定你的表创建脚本的时间是'DATETIME'吗? – swasheck

+0

是的,绝对的日期时间 - 它仍然现身为CAST(0x00009D4B00000000为DATETIME)虽然。 – Sniffer