数据脚本生成问题

2022-03-08 00:00:00 sql-server ssms

我很少使用SQL Server,在专业环境中我很清楚!不过,我正在做一个自己喜欢的项目,创建脚本时遇到问题。

我有一个在线数据库,需要从中提取所有内容。我在SQL Server Management Studio中使用"Tasks">"Generate Scripts"选项。以下是脚本创建的一条INSERT语句的示例(我有1,000条这样的插入语句):

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

我对此有两个问题:

(A)我想去掉两个title元素中的所有空格 (B)我不想要祸不单行日期-我想要像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条INSERT语句更改为此修订格式的最快方法是什么?

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

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

提前感谢!


解决方案

是,很遗憾,生成脚本将日期时间列脚本转换为CONVERT(BINARY_VALUE,DATETIME)。我会试着找出原因的答案(或者更重要的是,如果有办法改变行为)。我怀疑其原因是为了避免在具有不同地区/地区设置等的不同机器上运行脚本时出现的任何问题。我不知道是否有办法在此期间改变这种情况,但Management Studio不是编写数据脚本的唯一方法……您可以研究一下第三方产品,如Red-Gate的SQL Data Compare。

如果它确实只有3,000行,并且您打算在另一台服务器上运行生成的脚本,请停止使用向导并执行此操作(乍一看,这看起来很可怕,但它会做几件您想要做的事情-输出一个随时可以复制、粘贴和运行的脚本,具有良好格式和可读性的日期,通过GO命令按1000批量插入多行值,甚至处理标题、副标题和集合ID中可能为空值的情况):

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提供的脚本(并再次停止使用向导)。

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

相关文章