2015-06-09 1 views
0

У меня есть источник таблицы SRC, такие как:Если числовые затем вставить числовыми еще Вставить нечисловую

*Column1* 
First 
Second 
45 
Fouth 

Теперь я хочу, чтобы вставить эти данные в таблицу DEST (ID, NAME) с этой логикой:

Если строка является числовой , insert into (ID, NAME) VAUES (45, 'TBD').
Если строка не является числовым, генерировать идентификатор и 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

Должен ли быть сгенерированный идентификатор уникальным? В вашем примере, если у вас было 46 строк, в последнем случае также был бы сгенерированный идентификатор 45 (противоречащий вашему элементу данных «45»). –

+0

Да, они должны быть уникальными. Такая ситуация не будет, поскольку я проверяю, какие идентификаторы у меня уже есть в таблице DEST. Если у меня уже есть 45, мне не нужно вставлять его. Если мне не хватает этого идентификатора из таблицы SRC, его следует добавить в таблицу DEST. Таблица SRC - это таблица, содержащая записи, которые у меня нет в моей таблице DEST. – DNac

+0

Вы хотите вставить числовые или целые значения? Что означает колонка 'id' в' DEST'? – 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, однако, не может быть преобразован в numeric или int:

DECLARE @value varchar(10) = '.' 

SELECT ISNUMERIC(@value),TRY_CONVERT(INT,@value),TRY_CONVERT(NUMERIC(18,2),@value) 
Смежные вопросы