【问题标题】:Forcing a datatype in MS Access make table query在 MS Access 中强制数据类型进行表查询
【发布时间】:2010-12-24 09:41:00
【问题描述】:

我在 MS Access 中有一个查询,它从两个子查询创建一个表。对于正在创建的两列,我将第一个子查询中的一列划分为第二个子查询中的一列。

第一列的数据类型是double;第二列的数据类型是十进制,比例为 2,但我希望第二列也是双精度。

有没有办法在通过标准的 make-table Access 查询创建表时强制使用数据类型?

【问题讨论】:

  • 你能把SQL语句发一下吗?原始陈述会影响我们的回答方式。

标签: sql ms-access type-conversion


【解决方案1】:

您可以在列周围使用CDbl

【讨论】:

  • @onedayone 不正确,CDbl() 不会处理 Null,所以你需要按照他的建议处理它?
  • 那么您可以使用 NZ,而不仅仅是 iif。所以使用 CDbl(NZ(ColVal,0))
  • Nz() 不如我的 IIF(..IS NULL..) 构造:在 Access UI 之外使用时会导致语法错误。此外,由于 SQL 代码中的 Nz() 将结果强制转换为文本,因此数据类型会变得很奇怪。更多详细信息,请参阅allenbrowne.com/QueryPerfIssue.html。但是,在这种情况下,将其包装在 CDBL() 函数中“仅仅”会产生性能问题。
  • @David W. Fenton:如果您确实相信@onedaywhen 是正确的,那么您为什么不对答案投票?这是你的社区责任:)
  • 来自您的链接:Nz() 函数将 Null 替换为另一个值(通常是数字的零,或长度为零的文本字符串。)新值是 Variant 数据类型和 VBA用子类型标记它:String、Long、Double、Date 或其他。
【解决方案2】:

一种方法是在将任何内容放入表之前显式创建表。

你现在的说法大概是这样的:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
WHERE FirstName = 'Alistair'

但你也可以这样做:

----Create NewTable
CREATE TABLE NewTable(FirstName VARCHAR(100), LastName VARCHAR(100), Total DOUBLE)
----INSERT INTO NewTableusing SELECT
INSERT INTO NewTable(FirstName, LastName, Total)
SELECT FirstName, LastName, 
FROM Person p
INNER JOIN Orders o
ON p.P_Id = o.P_Id
WHERE p.FirstName = 'Alistair'

这样您就可以完全控制列类型。如果您需要重新创建该表,您可以随时删除它。

【讨论】:

  • 我认为这是唯一的方法,除了在 MakeTable 运行后更改数据类型。
【解决方案3】:

您可以使用强制转换为FLOAT 函数CDBL(),但有点奇怪的是,Access 数据库引擎无法处理 NULL 值,因此您必须自己处理这个问题,例如

SELECT first_column, 
       IIF(second_column IS NULL, NULL, CDBL(second_column)) 
          AS second_column_as_float
  INTO Table666
  FROM MyTest;

...但是您需要ALTER TABLE 来添加您的键、约束等。最好先简单地使用CREATE TABLE,然后使用INSERT INTO..SELECT 来填充它。

【讨论】:

    【解决方案4】:

    执行此操作的一种简单方法是创建一个具有正确字段类型的空表,然后进行追加到查询,Access 会自动将数据转换为目标字段。

    【讨论】:

      【解决方案5】:

      我也遇到过类似的情况,但我有一个生成表查询,它创建了一个具有 NUMERIC 数据类型的字段,我希望它是短文本。

      我所做的(我从 Stack 中得到了这个想法)是创建表,其中有问题的字段为短文本,同时构建一个删除查询来清理记录。我认为访问中的 DELETE 查询不会删除表,而只是删除其中的记录,这很有趣——我想你必须为此使用 DROP TABLE 函数来清除表......

      然后,我将我的生成表查询转换为 APPEND 查询,这是我以前从未做过的......我只是将 DELETE 查询的运行添加到我的进程中。

      谢谢你,堆栈溢出!

      史蒂夫

      【讨论】:

        【解决方案6】:

        我在我想确保存储为文本的字段中添加了一个“&”,并在我想存储为数字的字段中添加了一个“*1”(如将金额乘以 1)。

        似乎可以解决问题。

        【讨论】:

          【解决方案7】:

          要让 Access 查询从输入数字字段创建一个包含三个数字输出字段的表(它一直希望将输出字段设为文本字段),必须结合上述几个建议。预先建立一个空输出表,其中预定义输出字段为整数、双精度和双精度。在追加查询本身中,将数字字段乘以 1。有效。最后。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-18
          • 2018-10-11
          相关资源
          最近更新 更多