3

现在它生成像

INSERT [Bla] ([id], [description], [name], [version])
VALUES (CAST(1 AS Numeric(19, 0)), convert(t...

它是非常特定于 SQL Server 的。我想创建一个每个人都可以使用的脚本,与数据库无关。我有非常简单的数据类型 - varchars、数字、日期、位(布尔值)。

我认为

insert into bla values (1, 'die', '2001-01-01 11:11:11')

应该适用于所有 DBMS,对吧?

4

3 回答 3

3

一些基本规则:

去掉方括号。在您的情况下,它们不需要 - 即使在 SQL Server 中也是如此。(同时确保您从不在列名或表名中使用保留字或特殊字符)。

如果您确实需要使用特殊字符或保留字(我不建议这样做),请使用标准双引号(例如“GROUP”)。

但是请记住,名称是区分大小写的:根据标准与标准my_table相同MY_TABLE"my_table"不同。"MY_TABLE"同样,这可能因 DBMS 及其配置而异。

CAST 运算符是标准的,适用于大多数 DBMS(尽管并非所有都支持所有可能组合的强制转换)。

convert() 是特定于 SQL Server 的,应替换为适当的 CAST 表达式。

尝试以正确的数据类型指定值,永远不要依赖隐式数据转换(所以不要使用“1”作为数字)。尽管我认为不需要将 1 转换为 numeric() 。

通常我还建议DATE '2011-03-14'对 DATE/TIMESTAMP 文字使用 ANSI 文字(例如 ),但 SQL Server 不支持。所以对你帮助不大。

于 2011-03-14T09:26:49.703 回答
2

快速浏览一下关于 SQL 的 Wikipedia 文章,会告诉你一些关于不同实现的 SQL 标准化,例如 MS SQL、PostgreSQL、Oracle 等。

简而言之,有许多 ANSI 标准,但每个产品都有不同的支持。

从您的软件产品中支持多个数据库服务器的一般方法是接受存在差异,在数据库级别为它们编写代码,并使您的应用程序能够调用相同的数据库访问代码,而与数据库服务器无关。

于 2011-03-14T08:51:00.107 回答
0

数字格式存在许多问题,这些问题不会在 dbmses 之间移植,但是当您查看日期和日期格式的问题时,这就会相形见绌。例如,ORACLE DB 中使用的默认 DATE 格式取决于安装软件的人的想法,您可以使用日期转换函数让 ORACLE 接受常见的日期格式 - 但这些函数是 ORACLE 特定的。

此外,您如何知道目标数据库上的表名和列名相同?

如果你对此很认真,真的需要在氢 DBMS 之间移植数据,并且知道一点 perl,然后尝试使用 CPAN 提供的 SqlFairy。这个下载的绝对大小应该足以让你相信这个问题有多复杂。

于 2011-03-15T09:16:01.937 回答