如何转换SQL Server 2008数据库到SQL Server 2005

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何转换SQL Server 2008数据库到SQL Server 2005相关的知识,希望对你有一定的参考价值。

参考技术A 由于SQL Server 2008数据库转换到SQL Server 2005上,是不能通过备份还原、分离附加等操作来实现的,只能通过数据的导入导出实现。方法大致有几种: 1:通过Generate Scripts(包括数据) ,这个方法呢,如果对于很小的数据库,倒是一个非常方便的方法。注意前提是数据库很小,如果数据库很大,那你千万别选这个方法,SQL导入数据的性能会折磨死你。 2:通过Generate Scripts(生成表、视图等),然后使用SQL Server Import and Export Tool导入数据 3: Red Gate SQL Compare 工具 关于性能对比呢,博客园这位老兄的这篇文章"不同版本的SQL Server之间数据导出导入的方法及性能比较 " 已经做了详细的测试,下面只是介绍、总结转换SQL Server 2008数据库到SQL Server 2005的操作步骤。Generate ScriptsStep 1: 单击某个需要转换的数据库,然后选择任务(Tasks)——生成脚本(Generate Scripts)Step 2: 弹出生成脚本指导界面Step 3:选择需要导出的数据库对象,有导出整个数据库对象和选择指定数据库对象两个选项Step 4: 设置生成脚本选项,例如指定脚本位置,脚本文件的编码等等选择,最重要的是高级选项”Advanced“如下所示,最好在”Script for Server Version“ 里面选择”SQL Server 2005“等选项测试服务器这个版本里面没有'Script Data”(生成数据的脚本)选项,如下所示,如果你要通过脚本插入数据,那么就必须选择这个选项。Step 5: Summray your selections, 点击Next继续Step 6: 执行过程。完成后即生成了相应脚本文件。将生成的脚本在另外一台测试服务器执行,创建相应的数据库以及数据库对象。然后点击”SQL Server Import and Export“工具进行数据导入,操作步骤如下所示:SQL Server Import and ExportStep 1: 欢迎界面,点击Next跳过。Step 2: 选择数据源(Data Source),我们需要选择“SQL Server Native Client 10”, 输入身份认证信息,我选择Windows 身份认证。选择需要导出数据的数据库,例如,我选择一个测试数据库TSLStep 3:配置需要导入的Destination,选择对应的服务器和数据库Step 4:两个选择,选项1是用于整个表或视图导入导出,选项2用于书写查询SQL或导入导出Step 5: 勾选你需要导数的脚本,单击Source旁边的选项,即可选择全部对象。有时候需要编辑“Edit Mappings"选项,勾选”Enable identity Insert“,否则会导致后面导入导出报错Step 6: 勾选立即执行,点击Next执行下一步Step 7 : 执行过程,需要检查是否执行成功,查看相关出错信息。执行完成后,然后在测试服务器将该数据库备份压缩后,通过FTP上传到各个工厂,进行还原。关于 Red Gate SQL Compare的操作,也非常方便简单,由于测试过程中没有截图,就此略过。 由于测试用的数据库比较小,不知道比较大的数据库,例如几百G的数据,操作起来是否会遇到性能等杂七杂八的问题。不过相信很多人是不会遇到这么奇葩的案例的。例如使用导入导出工具,其实就会遇到一些小问题(以前遇到的): 1:在验证时出现错误,错误信息如下所示:- Validating (Error) Messages * Error 0xc02020f4: Data Flow Task 1: The column "xxxx" cannot be processed because more than one code page (936 and 1252) are specified for it. (SQL Server Import and Export Wizard) * Error 0xc02020f4: Data Flow Task 1: The column "xxxx" cannot be processed because more than one code page (936 and 1252) are specified for it. (SQL Server Import and Export Wizard) 解决:检查你源数据库和目标数据库的排序规则是否不一致,如果不一致,就会出现大量上面错误。 2:在验证时出现下面错误信息- Validating (Error) Messages * Error 0xc0202049: Data Flow Task 1: Failure inserting into the read-only column "xxxxx". (SQL Server Import and Export Wizard) * Error 0xc0202045: Data Flow Task 1: Column metadata validation failed. (SQL Server Import and Export Wizard) 解决:出现这个错误,是因为这一列是自动增长,需要在”Edite Mappings" 选项里面勾选“Enable Identity Insert”选项,如果数据库里面有大量这类列,是个头疼的问题。

如何将 Sql Server 2008 DateTimeOffset 转换为 DateTime

【中文标题】如何将 Sql Server 2008 DateTimeOffset 转换为 DateTime【英文标题】:How can I convert a Sql Server 2008 DateTimeOffset to a DateTime 【发布时间】:2011-06-24 15:28:33 【问题描述】:

我希望将具有DATETIMEOFFSET 字段的表转换为DATETIME 字段但通过注意偏移量来重新计算时间。实际上,这会将值转换为 UTC

例如。

CreatedOn: 2008-12-19 17:30:09.0000000 +11:00

这将被转换为

CreatedOn: 2008-12-19 06:30:09.0000000

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 -- that's a `DATETIMEOFFSET`, but `UTC`.

干杯:)

【问题讨论】:

参考***.com/questions/39719645/… 【参考方案1】:

使用几乎任何样式进行转换都会导致 datetime2 值转换为 UTC。 此外,从 datetime2 转换为 datetimeoffset 只需将偏移量设置为+00:00,如下所示,因此这是从Datetimeoffset(offset!=0) 转换为Datetimeoffset(+00:00) 的快速方法

declare @createdon datetimeoffset
set @createdon = '2008-12-19 17:30:09.1234567 +11:00'

select CONVERT(datetime2, @createdon, 1)
--Output: 2008-12-19 06:30:09.12

select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1))
--Output: 2008-12-19 06:30:09.1234567 +00:00

【讨论】:

有人能解释一下CONVERT的最后一个参数“1”是什么意思吗?此参数的所有示例都使用字符类型作为输出或输入类型。这里我们将 datetimeoffset 转换为 datetime。 convert() 函数采用第三个参数,该参数指定输出的格式。 https://www.w3schools.com/sql/func_convert.asp。 1 = "mm/dd/yy" 格式 第三个参数对于从datetimeoffsetdatetime2 的转换没有任何意义。它用于varchar 转换。 docs.microsoft.com/en-us/sql/t-sql/functions/…(也是 W3Schools?现在有这么多更好的选择!) @OzBob 你一定误解了这个问题,请求的两个选项之一是删除偏移量。关键是将时间转换为UTC。是否保持 +00.00 既不存在也不存在 请注意下面@user166390 的答案。 “如果未指定样式,则转换时丢弃时区信息”。如果不指定第三个参数,无论是 1 还是其他,都会丢失正确的 UTC 转换【参考方案2】:

我会使用内置 SQL 选项:

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')

【讨论】:

这是最好的答案(也支持 sql server 2014)。使用SWITCHOFFSET(...,0)内置函数转换datetimeoffset简单干净。【参考方案3】:

我知道这是一个老问题,但是,如果您想将 DateTimeOffset 转换为 DateTime,我认为您需要考虑要转换的服务器的时区。如果你只是做一个 CONVERT(datetime, @MyDate, 1) 你只会丢失时区,这可能会导致错误的转换。

我认为你首先需要切换 DateTimeOffset 值的偏移量,然后进行转换。

DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00';
SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET())));

在偏移量为 -7:00 的服务器上将 '2013-11-21 00:00:00.0000000 -00:00' 转换为 DateTime 的结果将是 2013-11-20 17:00:00.000。上面的逻辑不管服务器的时区是什么,也不管DateTime值的偏移量,都会转换成服务器时区的DateTime。

我认为您需要这样做,因为 DateTime 值包含该值在服务器时区中的假设。

【讨论】:

感谢 - 我们现在在 Azure 中运行了更多代码,但查询本地数据库,很高兴能够在云中获取 DateTimeOffset,通常是 UTC,然后转换它到本地时间,而不必知道本地服务器时区。如果云不是 UTC,在云中使用 DateTimeOffset 也会使我们隔离。 @Jeremy 显然,您在 5 年前还没有测试过答案中的代码。您不需要考虑要转换的服务器上的时区。 0600+04:00 在任何时区总是转换为 0200 (UTC)。 p/s 日期时间值是您的解释。它根本没有时区假设,这就是 datetimeoffset 存在的原因。 @RichardTheKiwi 我不认为你理解他在做什么。假设@MyDate 是外部数据。假设数据库将该值存储为带有服务器本地时间的datetime(对于仅在一个时区运行的应用程序来说,这是一种非常常见的应用程序规则)。您需要更正时区之前datetimeoffset 转换它。 SELECT CONVERT(DATETIME, @MyDate) 在 2013 年 11 月 21 日返回午夜,无论服务器的时区如何,也不管 datetimeoffset 中指定的偏移量如何。它只是删除偏移量而不转换为本地时间。【参考方案4】:

SQL Server 中的 DateTimeoffset(时区)转换。

SQL Server 2016 (13.x) 及更高版本

示例

Select GETUTCDATE()
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time')
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time')

结果将是

2020-08-18 08:22:21.640
2020-08-18 10:22:21.640
2020-08-18 13:52:21.640

【讨论】:

这就是我要找的。我需要将时区偏移保留到最终的日期时间值中,而不是丢弃。在另一个答案中键入 126 返回错误。谢谢! 正是我要找的,我需要时间来转换成主要时间块,这应该是最高投票的答案!!【参考方案5】:

注意:如果未指定样式(此处为“126”),则转换时丢弃时区信息。它也可能在其他一些样式中被丢弃,我不知道——无论如何,以下正确调整了 TZ 信息。见CAST and CONVERT。

select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc;

快乐的 SQL'ing。

编辑

不确定这是否重要,但...datetime 实际上无法存储该级别的精度/准确度。如果上述运行,小数秒将被截断为 3 位数字(并且精度低于该数字)。与datetime2(和datetimeoffset(7))相同,会产生非截断值:

select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc;

【讨论】:

什么是样式 126?为什么是 126? @Pure.Krome 请参阅回复中指向 CAST 和 CONVERT 的链接。 126 因为我喜欢 ISO 8601 并且不得不选择一个。这实际上与网络维基选择 1 没有什么不同。如前所述(在两个答案中),某些样式可能不考虑 TZ。 SQL Server 2008 R2 中的快速测试表明,仅使用样式 0 或(等效地)省略样式代码会丢弃时区信息。 MSDN 文档中列出的任何其他代码都将保留它。 我发现在直接从 DATETIMEOFFSET 转换为 DATETIME2 时,尝试样式 126 会导致错误(在 SQL Server 2012 中)作为不受支持的样式。除了 0 和 1 之外,我没有发现任何其他被接受的(但我没有尝试所有这些)。 126 是将DATETIMEOFFSET 转换为VARCHAR 的有效样式。【参考方案6】:

为了考虑夏令时,我使用了以下内容:

CONVERT(
  DateTime, 
  SWITCHOFFSET(
    CONVERT(
      DateTimeOffset, 
      CONVERT(
        DateTime, 
        [time_stamp_end_of_interval], 
        120
      )
    ),
    DATENAME(
      TzOffset, 
      CONVERT(
        DateTime, 
        [time_stamp_end_of_interval], 
        120
      ) AT TIME ZONE 'Pacific Standard Time'
    )
  )
)
AS GOOD_PST

注意:time_stamp_end_of_interval 是一个 varchar

【讨论】:

仅使用 SWITCHOFFSET(..., 0) 将 datetimeoffset 转换为 utc 没有与夏令时相关的问题。见docs.microsoft.com/en-us/sql/t-sql/functions/…

以上是关于如何转换SQL Server 2008数据库到SQL Server 2005的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008转换成sql 2000数据库如何操作?

无法通过 T4 模板访问我的 SQL Server 2008 错误返回给我如何获取表?

sq server2008登录不上去了,用windows身份也不行,怎么弄呀

使用 Powershell 从 SQL Server 2008 R2 导出到固定宽度的文本文件

怎么备份SQL Server 2008数据库

从 6.5 到 >= SQL Server 2008 的 SQL 查询转换