在sql server行中插入列值

在sql server行中插入列值,sql,sql-server,transpose,Sql,Sql Server,Transpose,我在-'上拆分'0021C-15563017-2'和' 我想在T2中插入(0021c,15563017,2),请参见图。 我尝试了交叉应用,在表(img2)的一行中插入分割值,但没有起作用 我使用的查询: SELECT CLNTCODE, certno, depcode FROM T2 CROSS APPLY STRING_SPLIT('0021C-15563017-2', '-'); 我建议不要在这里使用STRING\u SPLIT,因为可能很难从连字符分隔的字符串中找出三个组件。相

我在-'上拆分'0021C-15563017-2'和' 我想在T2中插入(
0021c
15563017
2
),请参见图。 我尝试了交叉应用,在表(img2)的一行中插入分割值,但没有起作用

我使用的查询:

SELECT CLNTCODE, certno, depcode  
FROM T2  
CROSS APPLY STRING_SPLIT('0021C-15563017-2', '-');

我建议不要在这里使用
STRING\u SPLIT
,因为可能很难从连字符分隔的字符串中找出三个组件。相反,我建议使用
CHARINDEX

WITH T2 AS (
    SELECT '0021C-15563017-2' AS col
)

SELECT
    LEFT(col, CHARINDEX('-', col) - 1) AS CLNTCODE,
    SUBSTRING(col,
              CHARINDEX('-', col) + 1,
              CHARINDEX('-', col, CHARINDEX('-', col) + 1) -
                  CHARINDEX('-', col) - 1) AS certno,
    SUBSTRING(col, CHARINDEX('-', col, CHARINDEX('-', col) + 1) + 1, LEN(col))
        AS depcode
FROM T2;

请注意,这里很难使用
STRING\u SPLIT
,因为很难从该函数的表值响应中寻址给定的记录。

这里:

CREATE TABLE YourTable(
    CLNTCODE VARCHAR(25), 
    certno VARCHAR(25), 
    depcode VARCHAR(25)
    );

WITH StrTbl(Col1, Col3, Str) AS
(
SELECT LEFT(Str, CHARINDEX('-', Str) - 1) Col1,
       LEFT(REVERSE(Str), CHARINDEX('-', REVERSE(Str)) - 1) Col3,
       Str
FROM
    (
      SELECT '0021C-15563017-2' AS Str
      UNION
      SELECT '0021C-1-2'
    ) T
)

INSERT INTO YourTable (CLNTCODE, certno, depcode)
SELECT Col1,
       REPLACE(REPLACE(REPLACE(Str, Col1, ''), Col3, ''), '-', '') AS Col2,
       Col3
FROM StrTbl;

SELECT *
FROM YourTable;
结果:

+----+----------+----------+---------+
|    | CLNTCODE |  certno  | depcode |
+----+----------+----------+---------+
|  1 | 0021C    | 15563017 |       2 |
|  2 | 0021C    |        1 |       2 |
+----+----------+----------+---------+

如果适合某人,也可以使用下面的方法

INSERT INTO T2 (CLNTCODE, certno, depcode)
SELECT LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2') - 1) AS CLNTCODE,
LEFT(REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), ''), CHARINDEX('-', REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), '')) - 1) AS certno,
LEFT(REVERSE('0021C-15563017-2'), CHARINDEX('-', REVERSE('0021C-15563017-2')) - 1) AS depcode

检查表T2是否有数据,它是否没有数据,然后您如何期望数据您需要什么请解释清楚您是否要求将这些('0021c'、'15563017'、'2')数据插入T2表?我想在表中插入拆分值('0021c-15563017-2-),如图所示。这是什么颜色?@Rahulray。我假设包含字符串的列名为
col
。这是返回正确的值,但没有在T2表中插入数据,然后使用
INSERT-INTO…SELECT
,然后使用我的查询。这恰好在这里起作用,因为
0021C
小于
15563017-2
,依次小于
2
。如果字符串是
15563017-0021C-2
,则我认为此解决方案不起作用。如果行返回的顺序或顺序很重要,请不要使用
string\u SPLIT
。aroundI还有许多类似函数的其他实现,我觉得好像我在什么地方见过这个答案:-)@TimBiegeleisen我觉得有人这么认为,并把我的答案录下来,因为他认为我复制/粘贴了他自己的答案,这是错误的:)我也不喜欢对
CHARINDEX()的三重调用,因为可以避免:)@Sami这个返回字符串“0021C-1-2”的错误结果,它应该返回-0021C,1,2,但它返回0021C,1-2,2这个返回错误的结果,它返回->clntcode=0021C,certno=1-2,depcode=2。对我来说,它返回正确。clntcode=0021C,certno=1,depcode=2。请重试,可能存在其他问题。只需将所有出现的“0021C-15563017-2”替换为“0021C-1-2”。如果你还面临任何问题,请告诉我。
INSERT INTO T2 (CLNTCODE, certno, depcode)
SELECT LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2') - 1) AS CLNTCODE,
LEFT(REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), ''), CHARINDEX('-', REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), '')) - 1) AS certno,
LEFT(REVERSE('0021C-15563017-2'), CHARINDEX('-', REVERSE('0021C-15563017-2')) - 1) AS depcode