SQL Server 删除自由文本中多余空格和换行符的SQL代码?

pftdvrlh  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(206)

我目前正在使用一个表,该表处理到诊所就诊的患者。该表中的一个字段显示就诊原因,并且是自由文本,因此无论是谁预约,都可以根据问题给医生留下自定义注解。是的,我很清楚自由文本实际上是最糟糕的。但我没有设计这个数据库或前端医疗记录系统(这也是最糟糕的),我只是坚持处理它。
由于特殊字符、额外的空格和回车符经常会进入前端的自由文本字段,因此其所有内容在SSMS中只显示在一行中,但在将SQL结果粘贴到Excel中时,额外的换行符会导致各种格式问题。我做了一些研究,发现了一段代码,可以替换给定字段中的回车符等。从而迫使该字段的所有内容保留在单个单元格中:
REPLACE(REPLACE(FieldName,char(10),''),char(13),'') as FieldName
这对于VisitReason字段和我不得不使用的任何其他自由文本字段都非常有效。* 然而 *,它是否考虑了自由文本中可能出现的所有问题?昨天我使用此表,并将SSMS的结果粘贴到Excel中。有两个人的VisitReason场被过早地切断,然后有了 * 所有 * 结果(就像在多个字段中一样)从一堆其他人的访问中提取出来,塞进同一个字段中(因此在Excel中形成了一个非常长的单元格)。
例如,其中一个人的VisitReason在SSMS中显示为complaining of rash, see note。但当它粘贴到Excel中时,结果看起来像...

PatientID    PatientName    VisitDate   ...   VisitReason
----------------------------------------------------------------------------------------------
1001         Smith, John    01/08/2023  ...   complaining of rash, see
                                              PatientID1002PatientNameJaneDoeVisitDate01/08/2023VisitRe
                                              asondiabetesfollowupPatientID1003PatientNameBobBrownVisitDa
                                              (and so on)

我不知道这是否与自由文本字段有关,并且其中存在一些隐藏字符,导致REPLACE函数无法捕获的奇怪的换行符和字段合并。或者是Excel的错误(在这种情况下,这显然不是一个正确的地方问)。但是我想检查一下,看看是否有什么东西可能需要添加到REPLACE行,以解决这个问题。
我的完整查询非常简单:

SELECT
    d.PatientID,
    d.PatientName,
    v.VisitDate,
    [some other visit-related fields, none of which are free text],
    REPLACE(REPLACE(v.VisitReason,char(10),''),char(13),'') as VisitReason,
    [some other demographic fields, none of which are free text]

FROM Demographics d 
JOIN Visit v ON d.PatientID = v.PatientID

REPLACE函数对于列表中的其他病人都能很好地工作,除了上面显示的两个病人,这两个病人的结果会影响到他们后面的其他行。

cpjpxq1n

cpjpxq1n1#

请尝试以下解决方案。
xs:token数据类型正在去除空白字符。

    • SQL语言**
USE tempdb;
GO

DROP FUNCTION IF EXISTS dbo.udf_tokenize;
GO

/*
1. All invisible TAB, Carriage Return, and Line Feed characters will be replaced with spaces.
2. Then leading and trailing spaces are removed from the value. 
3. Further, contiguous occurrences of more than one space will be replaced with a single space.
*/
CREATE FUNCTION dbo.udf_tokenize(@input VARCHAR(MAX))
   RETURNS VARCHAR(MAX)
AS
BEGIN 
   RETURN (SELECT CAST('<r><![CDATA[' + @input + ' ' + ']]></r>' AS XML).value('(/r/text())[1] cast as xs:token?','VARCHAR(MAX)'));
END
GO

-- DDL and sample data population, start
DECLARE @mockTbl TABLE (ID INT IDENTITY(1,1), col_1 VARCHAR(100), col_2 VARCHAR(100));
INSERT INTO @mockTbl (col_1, col_2) VALUES 
(CHAR(13) + '  FL   ' + CHAR(9), CHAR(10) + '  Miami'),
('  FL   ', '  Fort       Lauderdale   '),
('  NY   ', '  New           York   '),
('  NY   ', ''),
('  NY   ', NULL);
-- DDL and sample data population, end

-- before
SELECT *, LEN(col_2) AS [col_2_len] 
FROM @mockTbl;

-- remove invisible white space chars
UPDATE @mockTbl
SET col_1 = dbo.udf_tokenize(col_1)
, col_2 = dbo.udf_tokenize(col_2);

-- after
SELECT *, LEN(col_2) AS [col_2_len] 
FROM @mockTbl;

相关问题