瑞典 PC 上的程序员可以不编写涉及名为 V 和 W 的变量的 T-SQL 查询吗?

Posted

技术标签:

【中文标题】瑞典 PC 上的程序员可以不编写涉及名为 V 和 W 的变量的 T-SQL 查询吗?【英文标题】:Can programmers on a Swedish PC not write T-SQL queries involving variables named V and W? 【发布时间】:2016-09-16 07:34:14 【问题描述】:

我有这个视图源代码,写在一台带有 SQL Server 2012 和 Latin1 服务器和数据库排序规则的机器上:

SELECT TOP 100 PERCENT
  W.AbteilungsNr AS Bereichsnummer,
  W.LongCap AS Bereichsname,
  convert(datetime,convert(varchar(10),(SELECT MAX(V.ZeitVon) FROM mna01HSQVorfallsmeldungen V INNER JOIN mna01HSQProtokolle P ON P.[ID]=V.ProtokollID WHERE P.WS_Bereich_ID=W.[ID] AND P.Category=4 AND V.ProposedCat IN (41)),104),104) AS DatumLetzterMTC,
  convert(datetime,convert(varchar(10),(SELECT MAX(V.ZeitVon) FROM mna01HSQVorfallsmeldungen V INNER JOIN mna01HSQProtokolle P ON P.[ID]=V.ProtokollID WHERE P.WS_Bereich_ID=W.[ID] AND P.Category=4 AND V.ProposedCat IN (40)),104),104) AS DatumLetzterRWC,
  convert(datetime,convert(varchar(10),(SELECT MAX(V.ZeitVon) FROM mna01HSQVorfallsmeldungen V INNER JOIN mna01HSQProtokolle P ON P.[ID]=V.ProtokollID WHERE P.WS_Bereich_ID=W.[ID] AND P.Category=4 AND V.ProposedCat IN (42,44)),104),104) AS DatumLetzterLTI,
  convert(datetime,convert(varchar(10),(SELECT MAX(V.ZeitVon) FROM mna01HSQVorfallsmeldungen V INNER JOIN mna01HSQProtokolle P ON P.[ID]=V.ProtokollID WHERE P.WS_Bereich_ID=W.[ID] AND P.Category=4 AND V.ProposedCat IN (40,41,42,44)),104),104) AS DatumLetzterUnfall,
  DATEDIFF(day,(SELECT MAX(V.ZeitVon) FROM mna01HSQVorfallsmeldungen V INNER JOIN mna01HSQProtokolle P ON P.[ID]=V.ProtokollID WHERE P.WS_Bereich_ID=W.[ID] AND P.Category=4 AND V.ProposedCat IN (40,41,42,44)),GETDATE()) AS TageUnfallfrei
FROM mna01HSQWerksstruktur W
WHERE W.objType=1
AND W.Reportable=1
ORDER BY 
  W.AbteilungsNr ASC

如您所见,此代码依赖表别名 WV 代表两个不同的表。 当我尝试在具有排序规则 Finnish_Swedish_CI_AI 的数据库上执行该操作时,它失败了

Msg 207, Level 16, State 1, Procedure vwmna01HSQrptNoAccidentSince, Line 18
Invalid column name 'ID'

现在我已经完成了我的作业并发现,在瑞典语排序规则中,字母 V 和 W 被认为是相等的。当我们使用 Z 而不是 W 时,它可以工作。

我的问题仍然存在:

这是一个错误,还是将此排序规则应用于源代码有任何用途(我知道它需要应用于字符串文字和数据) 有什么方法可以防止这种情况发生,某种 SET 指令或连接属性?

编辑:它发生在 SSMS 查询窗口中以及在代码中使用 .NET SqlConnection 中的 OleDB 执行时。如果我们将其作为CREATE VIEW 语句的一部分执行,或者作为如上所示的即席查询执行,则没有区别。

【问题讨论】:

Similiar case @lad2025 有点类似,是的。但是:表名存储在 sysobjects 中,因此受整理规则的约束。不应该像行源别名这样的纯源代码结构。这就像您将一些 C 代码(如 int v,w;)发送给瑞典同事,但他无法编译它。 我在瑞典看到的大多数数据库都使用 Finnish_Swedish_CI_AS,这不是问题。 真的吗?也许我应该把它移到语言学.stackexchange.com,v/w 与口音敏感度有什么关系? 别名使用当前数据库的排序规则。使用另一个排序规则从数据库执行脚本的工作方式会有所不同。例如USE master; SELECT ... FROM swedishdatabase..table1 AS v, swedishdatabase..table2 AS w 【参考方案1】:

您的问题可能是区分大小写。如果有“ID”列,请检查您的表格 - 不要误认为“ID”。修正你的程序。

【讨论】:

数据库排序规则是 Finnish_Swedish_CI_AI(不区分大小写,不区分重音)。问题可以缩小到字母 V 和 W 的排序规则相等。 是的,但是服务器的排序规则可能区分大小写。 已排除区分大小写的原因。问题已减少两个测试用例:测试用例 1:使用表别名 V 和 W,结果:错误消息 207;测试用例 2:使用表别名 V 和 Z,结果:OK。

以上是关于瑞典 PC 上的程序员可以不编写涉及名为 V 和 W 的变量的 T-SQL 查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 上的瑞典语字符编码错误

win7 PC 上的 ASP.NET ETW 提供程序丢失

是否可以使用 Mac 或 PC 上的应用程序修改移动设备接收的数据?

保护用户 PC 上的应用程序数据库访问

将 Windows-mobile 6.5 应用程序连接到 PC 上的 sqlite 数据库

PC 上的 Android 与 Java:不同的 HttpResponse?