Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 拆下车架回位装置&;SQL中连接的拖车记录的换行符?_Sql Server_Tsql_Replace_Notepad - Fatal编程技术网

Sql server 拆下车架回位装置&;SQL中连接的拖车记录的换行符?

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

我有一个在SSMS中运行的SQL查询的结果数据集,该数据集包含一个以.txt格式导出并保存到记事本的1行拖车记录。但是,拖车记录自动包含十六进制控制,以便在拖车记录的串联字段(750个字符)之后包含换行/换行记录。在导出为.txt格式之前,如何从拖车记录的末尾消除此问题?文件不能包含任何空行

我在我的拖车记录的SELECT语句中尝试了以下行代码,这似乎是这种情况的常见修复方法:

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在很短的时间内。