如果是数字,则插入数字,否则插入非数字

时间:2015-06-09 12:23:55

标签: tsql insert sql-server-2014

我有表源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)

..,但这显然不起作用。怎么做?

2 个答案:

答案 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返回,但无法转换为numericint

DECLARE @value varchar(10) = '.'

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