对于我们的应用程序有5种语言版本,每当db表存储UI文本时,我们都会添加5列,每种语言一个,名称如label_EN,label_FR。然后构建SQL的方法接受一个语言参数,当我们动态构造SQL时,我们将其附加到基本列名称...
string language = "_EN";
cmd.Append( "select id, label" + language + " from myTable" );
有没有更好的方法,没有增加太多的复杂性?目标是使用单个查询获取语言参数并返回正确的标签,但我想摆脱使用字符串方法操作SQL。如果方便,我想在SQL中处理这个问题。如果有的话,我最喜欢遵循一个公认的模式。
答案 0 :(得分:0)
您可以使用Case语句获取所需的列,如下所示。在这种情况下,您使用不同语言标签的相同列名。
DECLARE @language VARCHAR(5) = '_EN';
SELECT id, CASE WHEN language = '_EN' THEN label_EN
WHEN language = '_FR' THEN label_FR
WHEN language = '_JR' THEN label_JR
WHEN language = '_PK' THEN label_PK
WHEN language = '_FK' THEN label_FK
END AS Label
FROM myTable
答案 1 :(得分:0)
您遇到的问题是缺乏规范化。因为每种语言都有列,所以您将永远与这种架构作斗争。添加第6种语言会发生什么?您将不得不返回并更改您的表以及访问它的所有查询。此外,您已经意识到,使用当前的设计,您必须构建字符串并执行它们。这样就可以打开sql注入。
如果你有5行数据,这将是一个标准化的设计,你的查询会很简单。
桌面设计就像这样。
create table myTable
(
ID int
, LabelText nvarchar(50)
, LanguageCode char(2)
)