【问题标题】:PostgreSQL query equivalent in MS SQL ServerMS SQL Server 中的 PostgreSQL 查询等效项
【发布时间】:2018-04-05 07:38:09
【问题描述】:

我有一个 PostgreSQL 数据库。我想把这个 PostgreSQL 数据库导出到 MS SQL Server 数据库中。

为此,首先我使用以下命令备份schema-only 的PostgreSQL 数据库并将其恢复到SQL Server 数据库中。我只是在 SQL Server 中将timestamp without time zone 类型替换为datetime

/opt/netiq/idm/apps/postgresql/bin/pg_dump -U admin --schema-only --no-owner --no-privileges testdata > /home/testdata.sql

然后我尝试在 SQL Server 数据库表中恢复 PostgreSQL 数据库数据。我使用以下命令备份 PostgreSQL 数据库数据

/opt/netiq/idm/apps/postgresql/bin/pg_dump -U admin --data-only --column-inserts testdata > /home/testdata.sql

当我尝试从上述转储中恢复数据时,出现以下错误

Conversion failed when converting date and/or time from character string

在下面的查询中

INSERT INTO databasechangelog (id, author, filename, dateexecuted, orderexecuted, exectype, md5sum, description, comments, tag, liquibase) VALUES ('3600', 'IDMRBPM', 'DbRenameTables.xml', '2017-09-06 00:36:31.985959+05:30', 83, 'MARK_RAN', '7:d83f1247d179d535dadf892528470df9', 'renameTable', 'Renaming PORTALREGISTRY to PORTALREGISTRY_ORIG', NULL, '3.1.1');

所以请帮我解决这个问题。

我有一些 PostgreSQL 数据库的以下查询,我想知道 MS SQL Server 中以下的等效查询是什么。

ALTER TABLE ONLY configuration_item ALTER COLUMN id SET DEFAULT nextval('configuration_item_id_seq'::regclass);
ALTER TABLE ONLY securityaccessrights ADD CONSTRAINT accrts_eliid_uk UNIQUE (fwelementiid, permissionid);
ALTER TABLE ONLY portalportlethandles ADD CONSTRAINT portlethandles_pk PRIMARY KEY (portletiid);
CREATE INDEX afcomment_messageid_idx ON afcomment USING btree (messageid);
ALTER TABLE ONLY afactivity ADD CONSTRAINT fk_activity_proc FOREIGN KEY (requestid) REFERENCES afprocess(requestid) ON DELETE CASCADE;
ALTER TABLE ONLY ui_item ADD CONSTRAINT fk_uiitem_citem FOREIGN KEY (id) REFERENCES configuration_item(id);

我正在使用MS SQL Server 2014 - 12.0.4100.1 (X64)PostgreSQL 9.3.4

【问题讨论】:

  • dateexecuted 列的类型是什么?接受带偏移的值应该是datetimeoffset
  • 每个 SQL 数据库都有自己的语言方言,有自己的怪癖和非标准扩展。您不太可能通过像这样的简单 export=>restore 从一个数据库移动到另一个数据库。 Postgresql 会做一些不同于 Sql Server 没有的标准的事情,而 Sql Server 会做一些不同于 Postgresql 没有的标准的事情。
  • SQL 标准允许不同级别的合规性,并且没有数据库提供比基本级别合规性更高的功能,尤其是 DDL。例如,SQL Server 就像 Postgres 一样支持序列。 SQL Server 使用 standard 语法 NEXT VALUE FOR 而您的示例中的 PostgreSQL 使用 custom 语法 nextval('somename')
  • '2017-09-06 00:36:31.985959+05:30' 的值是一个带有时区的时间戳。它应该映射到datetimeoffset
  • @PanagiotisKanavos 感谢您的回复,我无法将列的类型从datetime 更改为datetimeoffset。我有一个查询SELECT pg_catalog.setval('configuration_item_id_seq', 100, true);我必须在 SQL Server 中使用什么来代替这个,你能帮我解决这个问题吗?

标签: sql-server postgresql sql-server-2008 sql-server-2014 database-migration


【解决方案1】:

首先提到我正在使用的文档:
https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
(删除插入语句的信息,注释表示不正确)

更改表

来自 ms sql 文档的示例:

ALTER TABLE Person.ContactBackup ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID) REFERENCES Person.Person (BusinessEntityID) ;

从您的列表中选择的查询:

ALTER TABLE ONLY ui_item ADD CONSTRAINT fk_uiitem_citem FOREIGN KEY (id) REFERENCES configuration_item(id);

如果您从命令中删除 ONLY 应该没问题,它在 postgres 和 MS SQL 中都隐含。

如果您有默认值,请使用 DEFAULT 代替 SET DEFAULT

添加索引时,对于 MS SQL,它们是 CLUSTEREDUNCLUSTERED

例如:CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql

希望这会有所帮助。

【讨论】:

  • 那是。 SQL Server 的datetimeoffset 类型可以处理时区偏移
  • 感谢您指出这一点,删除了该位,不确定插入语句的问题所在。我对插入语句的最佳建议是作为字符串导入,因为一旦导入数据就会更改时间,但也许有人有更好的建议?
  • 问题是该字段不是datetimeoffset
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多