Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MS ACCESS SQL插入查询中设置数据类型_Sql_Ms Access 2007 - Fatal编程技术网

在MS ACCESS SQL插入查询中设置数据类型

在MS ACCESS SQL插入查询中设置数据类型,sql,ms-access-2007,Sql,Ms Access 2007,如何将INSERT中的数据类型显式转换为MS Access中的SELECT查询 示例查询: INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade ) SELECT sStudentID, sDate, sRate, sGrade FROM sStudents WHERE (((sStudents.sStudentID) Is Not Null); 在这里,我想在插入pStudents之前将sStudents表中的字段转换为以下字段: p

如何将INSERT中的数据类型显式转换为MS Access中的SELECT查询

示例查询:

INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade )
SELECT sStudentID, sDate, sRate, sGrade
FROM sStudents
WHERE (((sStudents.sStudentID) Is Not Null);
在这里,我想在插入pStudents之前将sStudents表中的字段转换为以下字段:

pStudentID = text
pDate = Short Date
pRate = Double
pGrade = text
INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade )
SELECT CStr(sStudentID), CDate(sDate), CDbl(sRate), CStr(sGrade)
FROM sStudents
WHERE (((sStudents.sStudentID) Is Not Null);

提前感谢

这应该行得通。如果您想要日期,可以使用CDate,但这将确保日期较短http://www.techonthenet.com/access/functions/date/format.php

INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade ) 
SELECT CStr(sStudentID), Format(sDate, "Short Date"), CDbl(sRate), CStr(sGrade) 
FROM sStudents WHERE (((sStudents.sStudentID) Is Not Null);

您可以在查询中使用Access的内置转换功能:

Select CStr(NumericColumn) from Table
…或作为插入查询:

你的意思是这样的吗

编辑:

好的,带有转换的示例查询如下所示:

INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade )
SELECT CStr(sStudentID), CDate(sDate), CDbl(sRate), CStr(sGrade)
FROM sStudents
WHERE (((sStudents.sStudentID) Is Not Null);
但是,只有当列只包含实际可以转换为给定类型的数据时,这才有效

例如,您可以使用CDbl将字符串列转换为Double,但前提是所选行仅包含实际可以转换为Double的值。
只要您选择了一行,该行的值包含除“hello”之类的数值以外的内容,转换就会失败

另一方面,你真的需要转换吗?
Access本身可以转换很多内容。例如,您可以将数值列中的值插入到字符串列中,Access将自己对其进行转换。您不必为此使用CStr。

Access中提供了许多转换功能

CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)
然后在INSERT INTO/SELECT查询中使用以下函数:

如果您需要转换SStudent中的每个字段,则可以根据您的编辑执行以下操作:

pStudentID = text
pDate = Short Date
pRate = Double
pGrade = text
INSERT INTO pStudents( pStudentID, pDate, pRate, pGrade )
SELECT CStr(sStudentID), CDate(sDate), CDbl(sRate), CStr(sGrade)
FROM sStudents
WHERE (((sStudents.sStudentID) Is Not Null);

您可以发布一个示例查询以及您想要转换为/来自的数据类型吗?@bluefeet示例查询,数据类型已更新above@user793468:更新我的答案!只要您选择了一个包含数值以外的值的行,转换就会失败——实际上,整个语句都会失败。对于null,它也会失败注意null不是一个值——实际上,在Access中它可能是:我有一个非常好的证明,这个注释太小了,无法包含。还请注意,转换函数内置于SQL引擎中:一个简单的证明是尝试使用CDEC转换为十进制:它接受的参数数量与其VBA等价物不同,因此不起作用!但答案很好;我知道整个语句都会失败……但我假设如果语句中的一个转换失败,那么整个语句都会失败:@onedaywhen我期待2370在这种情况下。@Remou:2370的意义是什么?@onedaywhen预期的证明延迟。这个定理最早是由皮埃尔·德·费马在1637年提出的,著名的是在一本《算术》的页边空白处,他声称自己有一个太大的证明,无法放在页边空白处。直到1995年才公布成功的证据