将MS Access Query转换为SQL

时间:2014-12-16 20:53:59

标签: sql-server tsql ms-access

您好我正在尝试将MSAccess查询转换为TSQL。

编辑其他详细信息;

用户通过ODBC使用我的数据库作为源表创建了MS Access应用程序。 根据我们的政策,MS Access仅用于特殊分析,不用于存储数据。 这个用法在他的应用程序中创建了一堆新表,并将其用作生产数据。我已经复制了他的逻辑并通过触发的脚本将其移动到SQL Server。我现在正试图将他的历史数据填充到SQL中。

在我的db中,MATERIAL_NUMBER是varchar(30)数据类型。 我们有各种不同的收购惯例。

我们收购的其中一家公司拥有“000000000000000001”等PN。 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

我收到以下错误

Msg 8114,Level 16,State 5,Line 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

编辑更新的ATTEMPT; 根据建议,我尝试了这个......

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没有。

enter image description here

2 个答案:

答案 0 :(得分:1)

MATERIAL_NUMBER列中有一些数字数据无法转换为整数

旧代码将数字数据转换为 Double

您可以像这样解决问题:

CASE WHEN ISNUMERIC([MATERIAL_NUMBER])=1 THEN CONVERT(VARCHAR(30),CAST([MATERIAL_NUMBER] AS FLOAT))
ELSE [MATERIAL_NUMBER] END AS PN_FORMAT

然而,我想知道你为什么需要这个。您有一个包含文本数据的列。它必须是文本,或者您甚至不需要检查IsNumeric()您最终将此转换为...更多文本。也许你正试图获得一种特定的格式,但这似乎也很奇怪。 Double就像数字一样广泛;你不可能改变什么。更有可能的是,此代码避免了Access中的某些问题;一个可能甚至不存在于Sql Server中的问题。除此之外,这首先是糟糕的数据库设计。如果你有这样一个列的混合类型,那么架构就会出现问题。


根据您的编辑,这对我有用:

select cast(cast('000000000004000192' as int) as varchar(10))
----------
4000192

(1 row(s) affected)

你也可以考虑这个答案:

  

Better techniques for trimming leading zeros in SQL Server?

或者,最重要的是,将新表中的列类型更改为整数。

答案 1 :(得分:0)

我能够通过使用以下方法解决此问题。 我从思考过程中尝试复制手段来复制结果。

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 SUBSTRING(MATERIAL_NUMBER, PATINDEX('%[^0 ]%', MATERIAL_NUMBER + ' '), LEN(MATERIAL_NUMBER)) 
ELSE MATERIAL_NUMBER END AS PN_FORMAT
FROM [DCA-DB-326\MSBI_RS].[AGS_DATAMART].dbo.OPR_MATERIAL_DIM O