If numeric then Insert numeric else 插入非数字

If numeric then Insert numeric else Insert non-numeric

我有table来源SRC例如:

*Column1*
First
Second
45
Fouth

现在我想使用以下逻辑将这些数据插入 table 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)

..,但这显然行不通。怎么做?

您可以采用以下方法,它使用 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

该示例不会直接移植到您的代码中,但应该为您提供一个良好的基础来开始工作,以实现您想要的结果。

请注意我对您原来的 post 的评论,如果使用此插入多行,您可能会在 ID 列上发生冲突。您将需要考虑在这种情况下该怎么做。

你可以尝试这样的事情。

首先通过检查 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]%' 来检查一个值是否只包含数字而不包含十进制值,如果是的话

例如,下面的值 '.' returns ISNUMERIC 作为 1 但是不能转换为 numericint :

DECLARE @value varchar(10) = '.'

SELECT ISNUMERIC(@value),TRY_CONVERT(INT,@value),TRY_CONVERT(NUMERIC(18,2),@value)