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
但是不能转换为 numeric
或 int
:
DECLARE @value varchar(10) = '.'
SELECT ISNUMERIC(@value),TRY_CONVERT(INT,@value),TRY_CONVERT(NUMERIC(18,2),@value)
我有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
但是不能转换为 numeric
或 int
:
DECLARE @value varchar(10) = '.'
SELECT ISNUMERIC(@value),TRY_CONVERT(INT,@value),TRY_CONVERT(NUMERIC(18,2),@value)