我正在尝试运行以下命令:
INSERT INTO dbo.[PM10100] (VCHRNMBR,CRDTAMNT,DEBITAMT,DSTINDX,...)
SELECT VCHNMBR,CRDTAMNT,DEBAMNT,CONVERT(int,DSTINDX),...
FROM dbo.[rahmani]
目标表中的 DSTINDX
是int
列(非空)
我收到以下错误消息:
Msg 245,Level 16,State 1,Line 1
将nvarchar值'G-PI100-5405-0000-UR'转换为数据类型int时转换失败。
错误引用了'G-PI100-5405-0000-UR'
列中的值DSTINDX
。
我知道这是因为nvarchar
试图转换为int
,有关如何在上述声明中更正此问题的任何想法?
答案 0 :(得分:1)
您明确地说:CONVERT(int,DSTINDX)
你为什么这样做?源显然是一个字符串列,因为它至少有一个字符串值(这是错误的来源)。
所以,你需要:
CASE
表达式保留这些值NULL
2& 3:
CREATE TABLE dbo.flung(id INT, DSTINDX VARCHAR(32));
INSERT dbo.flung VALUES(1,'1'),(2,'2'),(3,'G-PI100-5405-0000-UR');
SELECT id, DSTINDX = CASE
WHEN DSTINDX NOT LIKE '%[^0-9]%' THEN DSTINDX END
FROM dbo.flung;
SELECT id, DSTINDX FROM dbo.flung WHERE DSTINDX NOT LIKE '%[^0-9]%';
如果需要提取字符串列的子字符串并将其转换为INT
,则需要比CONVERT(INT
做得更好 - SQL Server不知道哪些部分您正在使用的那个字符串,并且您将不得不构建一个明确定义的表达式来提取该信息。