瑞典 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
如您所见,此代码依赖表别名 W
和 V
代表两个不同的表。
当我尝试在具有排序规则 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 查询吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Mac 或 PC 上的应用程序修改移动设备接收的数据?