如何处理SQL中文本标签的国际化?

时间:2016-06-24 13:16:08

标签: sql sql-server

对于我们的应用程序有5种语言版本,每当db表存储UI文本时,我们都会添加5列,每种语言一个,名称如label_EN,label_FR。然后构建SQL的方法接受一个语言参数,当我们动态构造SQL时,我们将其附加到基本列名称...

string language = "_EN";
cmd.Append( "select id, label" + language + " from myTable" );

有没有更好的方法,没有增加太多的复杂性?目标是使用单个查询获取语言参数并返回正确的标签,但我想摆脱使用字符串方法操作SQL。如果方便,我想在SQL中处理这个问题。如果有的话,我最喜欢遵循一个公认的模式。

2 个答案:

答案 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)
)