Приветствую.
На данный момент есть достаточно большая база, являющаяся хранилищем данных для сайтов. И есть один .aspx файл, генерирующий эти сайты. Основные составляющие базы - таблицы доменов, страниц, товаров, свойств товаров, картинок.
Задача - локализация сайтов, т.е. надо сделать возможность создавать сайты на разных языках.
Мы пока придумали три способа:
1) Из каждой таблички, требующей локализации вынести локализуемые данные в отдельную табличку с LanguageID. Т.е. если есть таблица Pages (ID, Alias, Title, Body) и Products (ID, Code, Name, Description), то вместо этого сделать так: Pages(ID, Alias) -> PagesLoc(PageID, LangID, Title, Body) и Products (ID, Code) -> ProductsLoc(ProductID, LangID, Name, Description). Этот вариант делать не стал, т.к. не хочется сильно плодить таблички.
2) Сделать одну таблицу - словарик и ссылаться на нее из всех других таблиц. Т.е. Вместо Pages (ID, Alias, Title, Body) будет Pages (ID, Alias, TitleID, BodyID) и словарик Words(ID, LangID, Word varchar(max)) - т.е. ключ будет по первым двум полям. Способ неплохой, но тоже недопустимы. К примеру, чтобы локализовать одну таблицу с 4 полями, придется писать такой запрос:
DECLARE @LangID int
SET @LangID=1
select p.id, t1.word title, t2.word Keywords, t3.word Body, t4.word txt
from _tezdPage p
inner join _tezd t1 on t1.ID=p.TitleID and t1.LangID=@LangID
inner join _tezd t2 on t2.ID=p.KeywordsID and t2.LangID=@LangID
inner join _tezd t3 on t3.ID=p.BodyID and t3.LangID=@LangID
inner join _tezd t4 on t4.ID=p.TextID and t4.LangID=@LangID
Что на мой взгляд достаточно криво и неудобно.
3) Самый продвинутый, как мы решили, вариант. Текущие Title, Body и т .д. заменить с варчара на тип XML. В нем хранить нужное количество языков и вытаскивать нужный. Все бы легко и просто, да вот только проблема появилась. Не можем выдернуть данные. Вот пример:
DECLARE @x XML, @Lang varchar(100)
SET @Lang='rus'
SET @X='
<rus aaa="d">абв</rus>
<eng>abc</eng>
<ukr>a12</ukr>'
SELECT cold.value('(/rus/@aaa)[1]', 'varchar') as result
FROM @x.nodes('/') as Tbl1(cold)
Вот так работает на ура. Если же заменить '(/rus/@aaa)[1]' на '(' + @Lang + '/@aaa)[1]', т.е. так:
SELECT cold.value('(/' + @Lang + '/@aaa)[1]', 'varchar') as result
FROM @x.nodes('/') as Tbl1(cold)
то появляется ошибка: The argument 1 of the xml data type method "value" must be a string literal.
Ответ на это есть вот здесь, но динамический SQL нам точно не подходит. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=438887&SiteID=1.
3б) Вместо стандартных XML функций использовать написать свою.
Так вот вопрос.
1) Есть ли возможность как-то это обойти? Первый вариант ответа я толком не понял.
2) Странно, почему это не предусмотрели. Может, мы в корне делаем неверно?
Если требуется еще кака-либо информация – пишите.
PS: Простите, что сообщение не отформатированр. Форум теги убивает :((