【发布时间】:2014-12-16 20:53:59
【问题描述】:
您好,我正在尝试将 MSAccess 查询转换为 TSQL。
编辑更多细节;
用户通过 ODBC 使用我的数据库作为源表创建了一个 MS Access 应用程序。 根据我们的政策,MS Access 仅用于临时分析,不存储数据。 好吧,这种用法在他的应用程序中创建了一堆新表,并将其用作生产数据。我已经复制了他的逻辑并通过触发脚本将其移至 SQL Server。我现在正在尝试将他的历史数据填充到 SQL 中。
在我的数据库中 MATERIAL_NUMBER 是 varchar(30) 数据类型。 我们对收购有各种不同的约定。
我们收购的其中一家公司有 PN,例如“000000000000000001”。 Access 应用程序的创建者不喜欢前导零会在导出时提示 Excel 说“数字存储为文本”,因此在他的表格中,他将以下内容应用于材料编号以将“000000000000000001”存储为“1”
这是访问查询。
IIf(IsNumeric([MATERIAL_NUMBER])=0,[MATERIAL_NUMBER],CStr(CDbl([MATERIAL_NUMBER]))) AS PN_FORMAT
现在的问题是我无法将他的桌子加入我的桌子,因为他破坏了 MATERIAL_NUMBER。 我要做的是对他的转换进行逆向工程,以便我可以将值更新回标准约定。
这是我在 SQL 中尝试过的
CASE WHEN ISNUMERIC([MATERIAL_NUMBER])=1
THEN CONVERT(VARCHAR(30),CAST([MATERIAL_NUMBER] AS BIGINT))
ELSE [MATERIAL_NUMBER]
END AS PN_FORMAT
我收到以下错误
消息 8114,第 16 级,状态 5,第 3 行 将数据类型 varchar 转换为 bigint 时出错。
这是完整的查询
TRUNCATE TABLE PN_FORMAT;
INSERT INTO PN_FORMAT
SELECT O.BASE_PART_CODE, O.MATERIAL_NUMBER,
CASE WHEN ISNUMERIC([MATERIAL_NUMBER])=1
THEN CONVERT(VARCHAR(30),CAST([MATERIAL_NUMBER] AS BIGINT))
ELSE [MATERIAL_NUMBER]
END AS PN_FORMAT
FROM [DCA-DB-326\MSBI_RS].[AGS_DATAMART].dbo.OPR_MATERIAL_DIM O
编辑更新的尝试; 根据建议,我尝试了这个...
TRUNCATE TABLE TEMP_PN_FORMAT;
INSERT INTO TEMP_PN_FORMAT
SELECT O.BASE_PART_CODE,
O.MATERIAL_NUMBER,
CASE WHEN ISNUMERIC([MATERIAL_NUMBER])=1 THEN CONVERT(VARCHAR(30),CAST([MATERIAL_NUMBER] AS FLOAT))
ELSE [MATERIAL_NUMBER] END AS PN_FORMAT
FROM [DCA-DB-326\MSBI_RS].[AGS_DATAMART].dbo.OPR_MATERIAL_DIM O
这次没有错误,但只有较小的数字有效。 647 按预期工作并且能够加入,4000192 没有。
【问题讨论】:
-
您在 MATERIAL_NUMBER 字段中的数据不是数字。你检查过吗?也许有破折号(
-)? -
是的,材料编号中存在明显的非数字数据,但 CASE ISNUMERIC 不应该评估这些数据并且只尝试将它们转换为其余部分吗?
标签: sql-server tsql ms-access