Sql server 拆下车架回位装置&;SQL中连接的拖车记录的换行符?
我有一个在SSMS中运行的SQL查询的结果数据集,该数据集包含一个以.txt格式导出并保存到记事本的1行拖车记录。但是,拖车记录自动包含十六进制控制,以便在拖车记录的串联字段(750个字符)之后包含换行/换行记录。在导出为.txt格式之前,如何从拖车记录的末尾消除此问题?文件不能包含任何空行 我在我的拖车记录的SELECT语句中尝试了以下行代码,这似乎是这种情况的常见修复方法:Sql server 拆下车架回位装置&;SQL中连接的拖车记录的换行符?,sql-server,tsql,replace,notepad,Sql Server,Tsql,Replace,Notepad,我有一个在SSMS中运行的SQL查询的结果数据集,该数据集包含一个以.txt格式导出并保存到记事本的1行拖车记录。但是,拖车记录自动包含十六进制控制,以便在拖车记录的串联字段(750个字符)之后包含换行/换行记录。在导出为.txt格式之前,如何从拖车记录的末尾消除此问题?文件不能包含任何空行 我在我的拖车记录的SELECT语句中尝试了以下行代码,这似乎是这种情况的常见修复方法: REPLACE(REPLACE('T'+CAST(RIGHT(REPLACE(STR(COUNT(*)),' ','0
REPLACE(REPLACE('T'+CAST(RIGHT(REPLACE(STR(COUNT(*)),' ','0'),9) AS VARCHAR)+SPACE(740),CHAR(10),''),CHAR(13),'')
然而,在以.txt格式导出时,它仍然包含换行符和回车十六进制字符
REPLACE(REPLACE('T'+CAST(RIGHT(REPLACE(STR(COUNT(*)),' ','0'),9) AS VARCHAR)+SPACE(740),CHAR(10),''),CHAR(13),'')
预期结果是文件不包含导出文档的包含十六进制视图中显示的0D和0A字节字符
当您选择“结果另存为”并选择文本文件时,结果是一个以制表符分隔的文本文件。每个字段由制表符分隔,每个记录由CR/LF终止。无法通过更改查询来更改这一点
生成的文本文件如下所示:
该文件以字节顺序标记EF BB BF开始,表示它是UTF-8格式。78、79和7A是“x”、“y”和“z”。这些由制表符(09)分隔,记录以CR/LF(OD/OA)终止。第二条记录也是如此,也由CR/LF终止
另一方面,您可以选择复制、运行记事本和粘贴文本。您将在记录之间获得CR/LFs,但最后没有
从您所说的话(以及下面的评论),我无法判断创建文本文件时问题是在SQL级别还是在SQL级别之外。无论哪种方式,您都可以使用can-help解决这个问题(该链接还包括一个VARCHAR(MAX)版本,它比8K版本慢,但仍然非常快。) 我经常通过OPENROWSET(或其他什么)导入构建脚本,修改文本,然后将结果写入一个新文件来替换旧文件(使用BCP),从而使手动更新构建脚本的过程自动化。下面是一些代码,帮助您理解如何使用NGrams函数来解决此问题 分析:
DECLARE @someString VARCHAR(8000) =
'blah blah blah.... ;
blah blah .... ;
blah blah blah.... ;
...;';
SELECT
ng.position,
ng.token,
charValue = ASCII(ng.Token),
binaryValue = CAST(ng.token AS VARBINARY(2))
FROM samd.NGrams8K(@someString,1) AS ng;
position token charValue binaryValue
-------------------- --------- ----------- -----------
1 b 98 0x62
2 l 108 0x6C
3 a 97 0x61
4 h 104 0x68
5 32 0x20
6 b 98 0x62
...
...
68 . 46 0x2E
69 . 46 0x2E
70 . 46 0x2E
71 32 0x20
72 ; 59 0x3B
73 13 0x0D
74 10 0x0A
75 32 0x20
76 32 0x20
....
返回(为简洁起见截断):
DECLARE @someString VARCHAR(8000) =
'blah blah blah.... ;
blah blah .... ;
blah blah blah.... ;
...;';
SELECT
ng.position,
ng.token,
charValue = ASCII(ng.Token),
binaryValue = CAST(ng.token AS VARBINARY(2))
FROM samd.NGrams8K(@someString,1) AS ng;
position token charValue binaryValue
-------------------- --------- ----------- -----------
1 b 98 0x62
2 l 108 0x6C
3 a 97 0x61
4 h 104 0x68
5 32 0x20
6 b 98 0x62
...
...
68 . 46 0x2E
69 . 46 0x2E
70 . 46 0x2E
71 32 0x20
72 ; 59 0x3B
73 13 0x0D
74 10 0x0A
75 32 0x20
76 32 0x20
....
注意第73和74行?这是您要删除的两个字符:CHAR(13)和CHAR(10),也称为0D和0A。您想删除这些
使用NGrams或NGrams8k,您可以通过定位最后一个字符(13)来获得最后一个LF+CR的位置
返回:73
注意,我正在使用一个变量(@someString)进行演示,如果GUI正在添加最终的LF/CR,那么您必须导入该文件并将内容分配给一个变量
DECLARE @someString VARCHAR(8000) =
'blah blah blah.... ;
blah blah .... ;
blah blah blah.... ;
...;';
-- Use STUFF to remove the last CHAR(13)+CHAR(10)
DECLARE @newString VARCHAR(8000) =
STUFF(
@someString,
(
SELECT MAX(ng.position)
FROM samd.Ngrams8K(@someString,1) AS ng
WHERE ASCII(ng.Token) = 13
),2,'');
此代码^^^^删除最终LF/CR
更新:
我刚刚看到大卫的反应;如果是这样,您可以使用我的解决方案将文件拉入,更改内容并编写新文件。下面是我如何做到这一点的一个例子(不是完美的,但它是有效的)
这段代码做了一些完全不同的事情,但您可以注意我是如何:
1.使用OPENROWSET将文件拉入
2.对内容做些什么(在我的代码中,我正在删除@badText定义的任何“坏文本”)
3.使用BCP写入新文件
希望这能有所帮助。可能有更好的自动化方法,但要回答提出的问题,您可以取消选中“复制时保留CR/LF”或“保存时保留CR/LF”框在Op中找到,该表达式中没有CR或LF。我想象它们是由将值写入文本文件的过程生成的。您是如何创建文本文件的?David,在以“结果到网格”模式运行查询后,我当前右键单击SSMS中显示的结果数据。然后选择“保存结果”“s为”并保存一个.txt格式的文件,其中包括问题行进纸和回车控件…谢谢。请尝试使用更简单的方法。当您尝试选择“x”并执行相同操作时会发生什么?我认为是保存过程添加了CR/LF。@DavidDubois OP可能尚未清除-CR和LF…是0D和0A。请注意此查询:
选择CAST(CHAR(13)作为VARBINARY(2)),CAST(CHAR(10)作为VARBINARY(2))
(我可能会误解你的意思)如果OP想要从现有文件的末尾删除CR/LF,他可以在记事本中打开它,将光标放在行的末尾,然后按DEL几次删除行终止符,然后保存。不幸的是,正在寻找一个更自动化的解决方案。感谢insight@DavidDubois,人们会惊讶地发现你可以使用记事本编辑文本。你应该在这上面写一篇博文。这会从所有行中删除CR/LF吗?我觉得可能会。我只希望从预告片记录行的末尾删除。抱歉,如果我没有完全清楚这方面的内容。是的,会的。我以为你只有一行,但有道理你没有。关闭,但仍然关闭我正在寻找一个自动化程度更高的解决方案,因为我每天晚上都有adTempus运行此任务。如果有其他想法,请告诉我。谢谢。现在您知道,您的查询中没有任何内容可以更改以解决您的问题。您可以删除所有试图删除它们的替换。我对adTempus一无所知,但我猜您是否可以utomate右键单击,选择一个菜单项并输入文件名,您可能可以自动运行记事本和复制/粘贴。或者您可以处理一个小得多的问题,只需找到一种方法从文件末尾删除两个字节。我敢打赌DOS批处理会有一些方法,或者如果没有任何开发人员可以为您提供suc在很短的时间内。