2015-06-09 40 views
0

我有表源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) [email protected], 'First'; 
     INSERT INTO DEST (ID, NAME) SELECT ROW_NUMBER() OVER(ORDER BY NAME) [email protected], 'Second'; 
     INSERT INTO DEST (ID, NAME) SELECT ROW_NUMBER() OVER(ORDER BY NAME) [email protected], 'Fourth'; 
    END; 

(simplified solution to demonstrate the purpose, it should be dynamic, not hardcoded) 

..,但这显然是行不通的。怎么做?你可以采取

+1

生成的ID是否必须是唯一的?在你的例子中,如果你有46行,那么最后一个也会有一个45的生成ID(与你的示例数据项'45'冲突)。 –

+0

是的,他们需要是唯一的。这种情况不会发生,因为我正在检查DEST表中已有的ID。如果我已经有45个,我不需要插入它。如果我缺少来自SRC表的此ID,则应将其添加到DEST表中。 SRC表格现在是包含我在DEST表格中没有的记录的表格。 – DNac

+0

你想插入数字或整数值吗? 'DEST'中的'id'列支持什么? – ughai

回答

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列上发生冲突。你需要考虑在这种情况下要做什么。

+0

谢谢,我玩了这一点,似乎工作。 – DNac

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)