我有表源SRC
,例如:
*Column1*
First
Second
45
Fouth
现在我想用这个逻辑将这些数据插入到表DEST (ID, NAME)
中:
如果行是数字,insert into (ID, NAME) VAUES (45, 'TBD')
。
如果该行不是数字,则生成ID并insert into (ID, NAME) VALUES (*GENERATED ID*, NAME).
我尝试过类似的事情:
DECLARE @i INT;
SELECT @i = MAX ( ID ) + 1
FROM DEST;
IF ( SELECT ISNUMERIC ( SELECT Column1 FROM SRC ) AS help ) = 1
BEGIN
INSERT INTO DEST (ID, NAME) VALUES (45, 'TBD')
END;
ELSE
BEGIN
INSERT INTO DEST (ID, NAME) SELECT ROW_NUMBER() OVER(ORDER BY NAME) +@i, 'First';
INSERT INTO DEST (ID, NAME) SELECT ROW_NUMBER() OVER(ORDER BY NAME) +@i, 'Second';
INSERT INTO DEST (ID, NAME) SELECT ROW_NUMBER() OVER(ORDER BY NAME) +@i, 'Fourth';
END;
(simplified solution to demonstrate the purpose, it should be dynamic, not hardcoded)
..,但这显然不起作用。怎么做?
答案 0 :(得分:1)
您可以采取以下一种方法:使用CASE
语句,以区分Column1
的数字和非数字值:
-- Some temporary tables to make the example work
CREATE TABLE #SRC (Column1 VARCHAR(50))
INSERT INTO #SRC (Column1) VALUES ('First'), ('Second'), ('45'), ('Fourth')
CREATE TABLE #DEST (ID INT)
DECLARE @i INT
-- If #DEST is empty we need to have an initial value of 1
SELECT @i = ISNULL(MAX(ID),0) + 1 FROM #DEST
PRINT @i
INSERT INTO #DEST (ID)
SELECT CASE ISNUMERIC(Column1)
WHEN 1 THEN Column1
ELSE ROW_NUMBER() OVER (ORDER BY Column1) + @i
END
FROM #SRC
SELECT *
FROM #DEST
DROP TABLE #SRC
DROP TABLE #DEST
该示例不会直接移植到您的代码中,但应为您提供良好的基础,以便开始工作以获得所需的结果。
请注意我对原始帖子的评论,如果用此插入多行,您可能会在ID
列上发生冲突。您需要考虑在这种情况下该怎么做。
答案 1 :(得分:0)
你可以尝试这样的事情。
首先通过选中ISNUMERIC
来插入数值。
INSERT INTO DEST (ID,Name)
SELECT TRY_CONVERT(INT,Column1),'TBD'
FROM SRC
WHERE ISNUMERIC(Column1) = 1
现在插入其他值
DECLARE @maxid INT
SELECT @maxid = MAX(ID) FROM DEST;
INSERT INTO DEST (ID,Name)
SELECT @maxid + ROW_NUMBER()OVER(ORDER BY Column1 ASC),Column1
FROM SRC
WHERE ISNUMERIC(Column1) = 0
注意:ISNUMERIC
不保证该值会成功转换为数值。此外,您似乎要检查值是否为整数而不是数字,除非您可以截断小数点。如果是这种情况,您可以使用Column1 LIKE '%[0-9]%'
检查值是否仅包含数字而不包含小数值
例如,以下值'.'
会将ISNUMERIC
作为1
返回,但无法转换为numeric
或int
:
DECLARE @value varchar(10) = '.'
SELECT ISNUMERIC(@value),TRY_CONVERT(INT,@value),TRY_CONVERT(NUMERIC(18,2),@value)