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

时间:2014-09-09 16:57:58

标签: sql delphi sql-server-2012

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) ';

当针对dev运行代码时,此查询会查找具有字符' ['和']'在里面 针对prod,查询找不到这些项目:

我检查的第一件事是数据:两种情况完全相同 我检查的第二件事是SQL服务器版本(BOTH服务器上的11.0.3128) 我要检查的第三件事是这些服务器上的设置:     DBCC用户选项; - 两者都一样     SELECT name,collat​​ion_Name FROM sys.databases - 两者都相同     选择@@ OPTIONS - 两者都相同。     带引号的标识符是' ON'对于两个服务器

归结为这样一个事实,我知道一个服务器正在处理转义字符(chr(27))与另一个服务器不同,但我确实知道原因。

有没有人有理论(或回答)为什么2个类似的服务器以不同方式处理转义字符?

这里的目标是让prod服务器返回值为' ['和']',因为设置我的系统以使用遗留代码将需要很多额外的时间。我确实修复了代码

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

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

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

1 个答案:

答案 0 :(得分:0)

我首先尝试查看此SQL是否仅在从应用程序发送时导致不同的行为:将SQL从交互式SQL客户端工具发送到两个服务器。

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

如果服务器是罪魁祸首,那么使用来自不同客户端工具的SQL应该会导致与两台服务器的差异。如果客户端工具在两台服务器上显示相同(正确)的结果,那么Delphi应用程序中会发生一些事情。

P.S。 upvoted,这是一个有趣的现象