gpt4 book ai didi

sql - 在不同服务器上执行相同代码(相同版本)会产生不同结果

转载 作者:行者123 更新时间:2023-12-03 18:47:41 25 4
gpt4 key购买 nike

Delphi旧代码出现问题。添加了一行代码来更正一个错误并创建了一个新错误。

新错误导致同一可执行文件在不同服务器上产生不同结果(将指针从dev切换到可执行文件上的prod环境)。

码:

sEscapedString:=stringreplace(sStringIn,'[','''+char(27)+''[',[rfReplaceAll]);
sEscapedString:=stringreplace(sEscapedString,']','''+char(27)+'']',[rfReplaceAll]);
sEscapedString:=stringreplace(sEscapedString,'''','''''',[rfReplaceAll]);// this line created new
bug
result:=' like ''' + Trim(sEscapedString) + '%'''+' escape char(27) ';


针对开发人员运行代码时,此查询将查找其中包含字符“ [”和“]”的对象
针对prod,查询未找到以下项目:

我检查的第一件事是数据:两种情况下完全相同
我检查的第二件事是SQL Server版本(两台服务器上均为11.0.3128)
我要检查的第三件事是这些服务器上的设置:
DBCC用户选项; -两者相同
SELECT名称,collat​​ion_Name FROM sys.databases-两者相同
选择@@ OPTIONS-两者相同。
两台服务器的带引号的标识符均为“ ON”

归结为这样一个事实,我知道一台服务器与另一台服务器对待转义符(chr(27))的方式不同,但是我不知道为什么。

是否有人对为什么两个相似的服务器对待转义字符的区别有一个理论(或答案)?

这里的目标是使生产服务器返回带有'['和']'的值,因为设置我的系统以使用旧版代码将花费很多时间。我的代码确实有修复

sEscapedString:=stringreplace(sStringIn,'[','[[]',[rfReplaceAll]);


但是更快的选择似乎是使服务器读取相同的值。

更新:我们找到了造成这种差异的根本原因,它比我们预期的要平凡得多,原来我们正在运行的查询实际上执行了两次。第二次执行缺少生产服务器上的关键部分。
通过移动新的代码行,使其首先执行而不是最后执行,解决了该问题。

最佳答案

首先,我将尝试找出此SQL是否仅从应用程序发送时引起不同的行为:通过将SQL从交互式SQL客户端工具发送到两个服务器。

为了确保手动测试的SQL与应用程序中的SQL完全相同,我将尝试记录或捕获从应用程序发送的确切SQL作为文本文件,然后将其内容粘贴到SQL客户端工具中。

如果服务器是罪魁祸首,则使用来自其他客户端工具的SQL应该会导致两台服务器具有相同的区别。如果客户端工具在两台服务器上显示相同(正确)的结果,则说明Delphi应用程序中发生了某些事情。

ps赞成,这是一个有趣的现象

关于sql - 在不同服务器上执行相同代码(相同版本)会产生不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com