我需要用定界符将一列拆分为多列。因此,我编写了以下脚本及其正常工作。
DECLARE @delimiter VARCHAR(50)
SET @delimiter=','
;WITH CTE AS
(
SELECT
[ODC_Number],
CAST('<M>' + REPLACE([ODC_Number], @delimiter , '</M><M>') + '</M>' AS XML)
AS [Employee Name XML]
FROM tbl_ODC_Number
)
SELECT
[ODC_Number] as ODC_Number,
[Employee Name XML].value('/M[1]', 'varchar(50)') As [ODC_Number1],
[Employee Name XML].value('/M[2]', 'varchar(50)') As [ODC_Number2],
[Employee Name XML].value('/M[3]', 'varchar(50)') As [ODC_Number3]
FROM CTE
现在,我需要知道如何在临时表中获得此结果并运行以下脚本来检查每个新列的格式,以确保每个列数据的格式正确:
格式:
ODC-XXXX-XXX-XXXXXX ODC-2018-076-895689
因此,我编写了以下代码(需要为每一列编写)
Select * from TEMPDB
Where
Len (ODC_Number1) < '19' or
ODC_Number1 not like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number1 like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]-[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number1 like '%[%*$#@;&/.\ ]%' or
ODC_Number1 not like '[CRI]%' or
ODC_Number1 like '%-CRI%'
我还处于非常基本的SQL级别。如果有人可以帮助我让我一起努力,我将不胜感激。 非常感谢。
我已经写了这两个脚本,但是不知道如何组合它们
答案 0 :(得分:0)
要将数据放入临时表中,只需执行SELECT * INTO #Temp FROM CTE
DECLARE @delimiter VARCHAR(50)
SET @delimiter=','
;WITH CTE AS
(
SELECT
[ODC_Number],
CAST('<M>' + REPLACE([ODC_Number], @delimiter , '</M><M>') + '</M>' AS XML)
AS [Employee Name XML]
FROM tbl_ODC_Number
)
SELECT
[ODC_Number] as ODC_Number,
[Employee Name XML].value('/M[1]', 'varchar(50)') As [ODC_Number1],
[Employee Name XML].value('/M[2]', 'varchar(50)') As [ODC_Number2],
[Employee Name XML].value('/M[3]', 'varchar(50)') As [ODC_Number3]
INTO #Temp
FROM CTE
现在为您的检查执行用OR
分隔的每一列的代码。
Select *
from #Temp
Where
(
Len (ODC_Number1) < '19' or
ODC_Number1 not like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number1 like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]-[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number1 like '%[%*$#@;&/.\ ]%' or
ODC_Number1 not like '[CRI]%' or
ODC_Number1 like '%-CRI%'
)
OR
(
Len (ODC_Number2) < '19' or
ODC_Number2 not like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number2 like '%[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]-[CRI]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]%' or
ODC_Number2 like '%[%*$#@;&/.\ ]%' or
ODC_Number2 not like '[CRI]%' or
ODC_Number2 like '%-CRI%'
)
OR
(...... You get the idea....