您好我正在尝试将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没有。
答案 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)
你也可以考虑这个答案:
或者,最重要的是,将新表中的列类型更改为整数。
答案 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