এটি একটি আকর্ষণীয় ইস্যু, সুতরাং আসুন শুরু করা যাক।
আসুন শুরু করা যাক পদ্ধতি 1 এর সমস্যাগুলি দ্বারা:
সমস্যা: আপনি গতি বাঁচাতে অস্বীকার করছেন।
এসকিউএল-তে (পোস্টারগ্রিসকুল ছাড়া হস্টোর সহ) আপনি কোনও প্যারামিটার ভাষা পাস করতে পারবেন না এবং বলবেন:
SELECT ['DESCRIPTION_' + @in_language] FROM T_Products
সুতরাং আপনাকে এটি করতে হবে:
SELECT
Product_UID
,
CASE @in_language
WHEN 'DE' THEN DESCRIPTION_DE
WHEN 'SP' THEN DESCRIPTION_SP
ELSE DESCRIPTION_EN
END AS Text
FROM T_Products
যার অর্থ আপনি যদি কোনও নতুন ভাষা যুক্ত করেন তবে আপনাকে আপনার সমস্ত প্রশ্নের পরিবর্তন করতে হবে। এটি স্বাভাবিকভাবেই "ডায়নামিক এসকিউএল" ব্যবহারের দিকে পরিচালিত করে, তাই আপনাকে আপনার সমস্ত প্রশ্নের পরিবর্তন করতে হবে না।
এটি সাধারণত এর মতো কিছুতে পরিণতি দেয় (এবং এটি দর্শন বা টেবিল-মূল্যবান ফাংশনগুলিতে উপায় হিসাবে ব্যবহার করা যায় না, যদি আপনাকে রিপোর্টিংয়ের তারিখটি ফিল্টার করার দরকার হয় তবে এটি আসলেই একটি সমস্যা)
CREATE PROCEDURE [dbo].[sp_RPT_DATA_BadExample]
@in_mandant varchar(3)
,@in_language varchar(2)
,@in_building varchar(36)
,@in_wing varchar(36)
,@in_reportingdate varchar(50)
AS
BEGIN
DECLARE @sql varchar(MAX), @reportingdate datetime
-- Abrunden des Eingabedatums auf 00:00:00 Uhr
SET @reportingdate = CONVERT( datetime, @in_reportingdate)
SET @reportingdate = CAST(FLOOR(CAST(@reportingdate AS float)) AS datetime)
SET @in_reportingdate = CONVERT(varchar(50), @reportingdate)
SET NOCOUNT ON;
SET @sql='SELECT
Building_Nr AS RPT_Building_Number
,Building_Name AS RPT_Building_Name
,FloorType_Lang_' + @in_language + ' AS RPT_FloorType
,Wing_No AS RPT_Wing_Number
,Wing_Name AS RPT_Wing_Name
,Room_No AS RPT_Room_Number
,Room_Name AS RPT_Room_Name
FROM V_Whatever
WHERE SO_MDT_ID = ''' + @in_mandant + '''
AND
(
''' + @in_reportingdate + ''' BETWEEN CAST(FLOOR(CAST(Room_DateFrom AS float)) AS datetime) AND Room_DateTo
OR Room_DateFrom IS NULL
OR Room_DateTo IS NULL
)
'
IF @in_building <> '00000000-0000-0000-0000-000000000000' SET @sql=@sql + 'AND (Building_UID = ''' + @in_building + ''') '
IF @in_wing <> '00000000-0000-0000-0000-000000000000' SET @sql=@sql + 'AND (Wing_UID = ''' + @in_wing + ''') '
EXECUTE (@sql)
END
GO
এটির সাথে সমস্যাটি হ'ল
) তারিখ-বিন্যাসটি খুব ভাষা-নির্দিষ্ট, তাই আপনি যদি সেখানে আইএসও ফর্ম্যাটে ইনপুট না রাখেন (তবে গড় বাগানের বিভিন্ন ধরণের প্রোগ্রামার সাধারণত না করে এবং আপনার ক্ষেত্রে সমস্যা হয়) একটি প্রতিবেদন ব্যবহারকারী নিশ্চিত করে যে আপনার জন্য নরক কিছু করবে না, এমনকি যদি তা স্পষ্টভাবে করার জন্য নির্দেশিত হয়)।
এবং
খ) সর্বাধিক উল্লেখযোগ্যভাবে , আপনি যেকোন ধরণের সিনট্যাক্স চেকিং .িলা করেন । যদি <insert name of your "favourite" person here>
স্কিমাটি পরিবর্তন করে কারণ হঠাৎ করে উইং পরিবর্তনের প্রয়োজনীয়তা এবং নতুন একটি টেবিল তৈরি করা হয়, পুরানোটি বাকি থাকে তবে রেফারেন্স ফিল্ডটির নাম পরিবর্তন করা হয়, আপনি কোনও ধরণের সতর্কতা পান না। উইং প্যারামিটার (==> গাইড.empty) বাছাই । তবে হঠাৎ, যখন প্রকৃত ব্যবহারকারী প্রকৃতপক্ষে একটি ডানা নির্বাচন করে ==>বুম বাছাই না করে আপনি যখন এটি চালান তখনও একটি প্রতিবেদন কাজ করে । এই পদ্ধতিটি কোনও ধরণের পরীক্ষাকে পুরোপুরি বিরতি দেয়।
পদ্ধতি 2:
সংক্ষেপে: "দুর্দান্ত" ধারণা (সতর্কতা - কটাক্ষ), আসুন পদ্ধতির 3 টির অসুবিধাগুলি (ধীরে ধীরে যখন বহু প্রবেশাধিকারী) মেথডের বরং ভয়াবহ অসুবিধাগুলির সাথে একত্রিত করি
। এই পদ্ধতির একমাত্র সুবিধাটি আপনি রাখেন সমস্ত টেবিল একটি টেবিল, এবং তাই রক্ষণাবেক্ষণ সহজ। যাইহোক, একই জিনিসটি পদ্ধতি 1 এবং একটি গতিশীল এসকিউএল সঞ্চিত প্রক্রিয়া এবং অনুবাদগুলি সম্বলিত একটি (সম্ভবত অস্থায়ী) সারণী এবং লক্ষ্য সারণির নাম (এবং আপনার সমস্ত পাঠ্য-ক্ষেত্রের নামকরণ করা বেশ সাধারণভাবে ধরে নেওয়া যায়) একই)।
পদ্ধতি 3:
সমস্ত অনুবাদগুলির জন্য একটি টেবিল: অসুবিধা: আপনার অনুবাদ করতে চান এমন ক্ষেত্রগুলির জন্য পণ্য টেবিলে আপনাকে n বিদেশী কীগুলি সংরক্ষণ করতে হবে। অতএব, আপনাকে এন ক্ষেত্রের সাথে যোগ দিতে হবে। অনুবাদ টেবিলটি যখন বিশ্বব্যাপী হয়, তখন এর অনেকগুলি এন্ট্রি থাকে এবং ধীরে ধীরে যোগ দেয়। এছাড়াও, আপনাকে সর্বদা n টি ক্ষেত্রের জন্য টি টাইপআরএলসেশনে সারণিতে যোগ দিতে হবে। এটি বেশ ওভারহেড। এখন, যখন আপনার অবশ্যই গ্রাহক প্রতি কাস্টম অনুবাদগুলি সমন্বিত করতে হবে? আপনাকে একটি অতিরিক্ত টেবিলের সাথে আরও 2x এন যোগ দিতে হবে। আপনার যদি যোগ দিতে হয় তবে 2x2xn = 4n অতিরিক্ত যোগ দিয়ে 10 টি টেবিল বলুন, কী গোলমাল! এছাড়াও, এই নকশাটি 2 টি টেবিলের সাথে একই অনুবাদ ব্যবহার সম্ভব করে তোলে। আমি যদি একটি টেবিলের আইটেমের নামটি পরিবর্তন করি তবে আমি কি প্রতিটি টেবিলের পাশাপাশি অন্য এক টেবিলে কোনও এন্ট্রি পরিবর্তন করতে চাই?
এছাড়াও আপনি টেবিলটি আর মুছতে এবং পুনরায় সন্নিবেশ করতে পারবেন না, কারণ এখন পণ্য টেবিলগুলিতে বিদেশী কী রয়েছে ... আপনি অবশ্যই এফকে সেট করতে বাদ দিতে <insert name of your "favourite" person here>
পারেন , এবং তারপরে টেবিলটি মুছতে পারেন এবং পুনরায় সন্নিবেশ করতে পারেন because newid () সহ সমস্ত এন্ট্রি [বা সন্নিবেশে আইডি নির্দিষ্ট করে, তবে পরিচয়-সন্নিবেশ বন্ধ রয়েছে ], এবং এটি (এবং করবে) সত্যই শীঘ্রই ডেটা-আবর্জনা (এবং নাল-রেফারেন্স ব্যতিক্রম) এ নিয়ে যাবে।
পদ্ধতি 4 (তালিকাভুক্ত নয়): ডাটাবেসে একটি এক্সএমএল ক্ষেত্রে সমস্ত ভাষা সংরক্ষণ করা। যেমন
-- CREATE TABLE MyTable(myfilename nvarchar(100) NULL, filemeta xml NULL )
;WITH CTE AS
(
-- INSERT INTO MyTable(myfilename, filemeta)
SELECT
'test.mp3' AS myfilename
--,CONVERT(XML, N'<?xml version="1.0" encoding="utf-16" standalone="yes"?><body>Hello</body>', 2)
--,CONVERT(XML, N'<?xml version="1.0" encoding="utf-16" standalone="yes"?><body><de>Hello</de></body>', 2)
,CONVERT(XML
, N'<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<lang>
<de>Deutsch</de>
<fr>Français</fr>
<it>Ital&iano</it>
<en>English</en>
</lang>
'
, 2
) AS filemeta
)
SELECT
myfilename
,filemeta
--,filemeta.value('body', 'nvarchar')
--, filemeta.value('.', 'nvarchar(MAX)')
,filemeta.value('(/lang//de/node())[1]', 'nvarchar(MAX)') AS DE
,filemeta.value('(/lang//fr/node())[1]', 'nvarchar(MAX)') AS FR
,filemeta.value('(/lang//it/node())[1]', 'nvarchar(MAX)') AS IT
,filemeta.value('(/lang//en/node())[1]', 'nvarchar(MAX)') AS EN
FROM CTE
তারপরে আপনি এসকিউএল-এ এক্সপথ-কোয়েরি দ্বারা মানটি পেতে পারেন, যেখানে আপনি স্ট্রিং-ভেরিয়েবলটি রাখতে পারেন
filemeta.value('(/lang//' + @in_language + '/node())[1]', 'nvarchar(MAX)') AS bla
এবং আপনি এর মতো মান আপডেট করতে পারেন:
UPDATE YOUR_TABLE
SET YOUR_XML_FIELD_NAME.modify('replace value of (/lang/de/text())[1] with ""I am a ''value ""')
WHERE id = 1
আপনি কোথায় প্রতিস্থাপন করতে পারেন /lang/de/...
সঙ্গে'.../' + @in_language + '/...'
পোস্টগ্রি হস্টোরের মতো ধরণের, এক্সএমএল পার্সিংয়ের ওভারহেডের কারণে (পিজি হস্টোরের কোনও এসোসিয়েটিভ অ্যারে থেকে এন্ট্রি পড়ার পরিবর্তে) এটি অনেক ধীর হয়ে যায় প্লাস xML এনকোডিংটি দরকারী হওয়াতে খুব বেদনাদায়ক করে তোলে।
পদ্ধতি 5 (সানউইউকুং দ্বারা প্রস্তাবিত, আপনার চয়ন করা উচিত): প্রতিটি "পণ্য" সারণীর জন্য একটি অনুবাদ সারণী। এর অর্থ প্রতি ভাষা প্রতি একটি সারি এবং বেশ কয়েকটি "পাঠ্য" ক্ষেত্র, সুতরাং এটি N ক্ষেত্রগুলিতে কেবলমাত্র একটি (বাম) যোগদানের প্রয়োজন। তারপরে আপনি সহজেই "পণ্য"-টেবিলটিতে একটি ডিফল্ট ক্ষেত্র যুক্ত করতে পারেন, আপনি সহজেই অনুবাদ টেবিলটি মুছতে এবং পুনরায় সন্নিবেশ করতে পারেন এবং কাস্টম-অনুবাদগুলির জন্য (দ্বিতীয় চাহিদা অনুসারে) একটি দ্বিতীয় সারণী তৈরি করতে পারেন, যা আপনি মুছে ফেলতেও পারেন এবং পুনরায় sertোকান) এবং আপনার কাছে এখনও সমস্ত বিদেশী কী রয়েছে।
এই কর্মগুলি দেখার জন্য একটি উদাহরণ তৈরি করি:
প্রথমে সারণী তৈরি করুন:
CREATE TABLE dbo.T_Languages
(
Lang_ID int NOT NULL
,Lang_NativeName national character varying(200) NULL
,Lang_EnglishName national character varying(200) NULL
,Lang_ISO_TwoLetterName character varying(10) NULL
,CONSTRAINT PK_T_Languages PRIMARY KEY ( Lang_ID )
);
GO
CREATE TABLE dbo.T_Products
(
PROD_Id int NOT NULL
,PROD_InternalName national character varying(255) NULL
,CONSTRAINT PK_T_Products PRIMARY KEY ( PROD_Id )
);
GO
CREATE TABLE dbo.T_Products_i18n
(
PROD_i18n_PROD_Id int NOT NULL
,PROD_i18n_Lang_Id int NOT NULL
,PROD_i18n_Text national character varying(200) NULL
,CONSTRAINT PK_T_Products_i18n PRIMARY KEY (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id)
);
GO
-- ALTER TABLE dbo.T_Products_i18n WITH NOCHECK ADD CONSTRAINT FK_T_Products_i18n_T_Products FOREIGN KEY(PROD_i18n_PROD_Id)
ALTER TABLE dbo.T_Products_i18n
ADD CONSTRAINT FK_T_Products_i18n_T_Products
FOREIGN KEY(PROD_i18n_PROD_Id)
REFERENCES dbo.T_Products (PROD_Id)
ON DELETE CASCADE
GO
ALTER TABLE dbo.T_Products_i18n CHECK CONSTRAINT FK_T_Products_i18n_T_Products
GO
ALTER TABLE dbo.T_Products_i18n
ADD CONSTRAINT FK_T_Products_i18n_T_Languages
FOREIGN KEY( PROD_i18n_Lang_Id )
REFERENCES dbo.T_Languages( Lang_ID )
ON DELETE CASCADE
GO
ALTER TABLE dbo.T_Products_i18n CHECK CONSTRAINT FK_T_Products_i18n_T_Products
GO
CREATE TABLE dbo.T_Products_i18n_Cust
(
PROD_i18n_Cust_PROD_Id int NOT NULL
,PROD_i18n_Cust_Lang_Id int NOT NULL
,PROD_i18n_Cust_Text national character varying(200) NULL
,CONSTRAINT PK_T_Products_i18n_Cust PRIMARY KEY ( PROD_i18n_Cust_PROD_Id, PROD_i18n_Cust_Lang_Id )
);
GO
ALTER TABLE dbo.T_Products_i18n_Cust
ADD CONSTRAINT FK_T_Products_i18n_Cust_T_Languages
FOREIGN KEY(PROD_i18n_Cust_Lang_Id)
REFERENCES dbo.T_Languages (Lang_ID)
ALTER TABLE dbo.T_Products_i18n_Cust CHECK CONSTRAINT FK_T_Products_i18n_Cust_T_Languages
GO
ALTER TABLE dbo.T_Products_i18n_Cust
ADD CONSTRAINT FK_T_Products_i18n_Cust_T_Products
FOREIGN KEY(PROD_i18n_Cust_PROD_Id)
REFERENCES dbo.T_Products (PROD_Id)
GO
ALTER TABLE dbo.T_Products_i18n_Cust CHECK CONSTRAINT FK_T_Products_i18n_Cust_T_Products
GO
তারপরে ডেটা পূরণ করুন
DELETE FROM T_Languages;
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (1, N'English', N'English', N'EN');
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (2, N'Deutsch', N'German', N'DE');
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (3, N'Français', N'French', N'FR');
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (4, N'Italiano', N'Italian', N'IT');
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (5, N'Russki', N'Russian', N'RU');
INSERT INTO T_Languages (Lang_ID, Lang_NativeName, Lang_EnglishName, Lang_ISO_TwoLetterName) VALUES (6, N'Zhungwen', N'Chinese', N'ZH');
DELETE FROM T_Products;
INSERT INTO T_Products (PROD_Id, PROD_InternalName) VALUES (1, N'Orange Juice');
INSERT INTO T_Products (PROD_Id, PROD_InternalName) VALUES (2, N'Apple Juice');
INSERT INTO T_Products (PROD_Id, PROD_InternalName) VALUES (3, N'Banana Juice');
INSERT INTO T_Products (PROD_Id, PROD_InternalName) VALUES (4, N'Tomato Juice');
INSERT INTO T_Products (PROD_Id, PROD_InternalName) VALUES (5, N'Generic Fruit Juice');
DELETE FROM T_Products_i18n;
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (1, 1, N'Orange Juice');
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (1, 2, N'Orangensaft');
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (1, 3, N'Jus d''Orange');
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (1, 4, N'Succo d''arancia');
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (2, 1, N'Apple Juice');
INSERT INTO T_Products_i18n (PROD_i18n_PROD_Id, PROD_i18n_Lang_Id, PROD_i18n_Text) VALUES (2, 2, N'Apfelsaft');
DELETE FROM T_Products_i18n_Cust;
INSERT INTO T_Products_i18n_Cust (PROD_i18n_Cust_PROD_Id, PROD_i18n_Cust_Lang_Id, PROD_i18n_Cust_Text) VALUES (1, 2, N'Orangäsaft'); -- Swiss German, if you wonder
এবং তারপরে ডেটাটি জিজ্ঞাসা করুন:
DECLARE @__in_lang_id int
SET @__in_lang_id = (
SELECT Lang_ID
FROM T_Languages
WHERE Lang_ISO_TwoLetterName = 'DE'
)
SELECT
PROD_Id
,PROD_InternalName -- Default Fallback field (internal name/one language only setup), just in ResultSet for demo-purposes
,PROD_i18n_Text -- Translation text, just in ResultSet for demo-purposes
,PROD_i18n_Cust_Text -- Custom Translations (e.g. per customer) Just in ResultSet for demo-purposes
,COALESCE(PROD_i18n_Cust_Text, PROD_i18n_Text, PROD_InternalName) AS DisplayText -- What we actually want to show
FROM T_Products
LEFT JOIN T_Products_i18n
ON PROD_i18n_PROD_Id = T_Products.PROD_Id
AND PROD_i18n_Lang_Id = @__in_lang_id
LEFT JOIN T_Products_i18n_Cust
ON PROD_i18n_Cust_PROD_Id = T_Products.PROD_Id
AND PROD_i18n_Cust_Lang_Id = @__in_lang_id
যদি আপনি অলস হন, তবে আপনি ভাষা-সারণীর প্রাথমিক কী হিসাবে আইএসও-টু লেটারনাম ('ডিই', 'এন' ইত্যাদি) ব্যবহার করতে পারেন, তবে আপনাকে ভাষা আইডিটি অনুসন্ধান করতে হবে না। তবে আপনি যদি এটি করেন তবে আপনি সম্ভবত এর পরিবর্তে আইইটিএফ-ভাষা ট্যাগটি ব্যবহার করতে চান , এটি আরও ভাল, কারণ আপনি ডি-সিএইচ এবং ডি-ডি পেয়ে যান, যা সত্যই একই অরোগ্রাফি অনুসারে নয় (সর্বত্র of এর পরিবর্তে ডাবল এস) যদিও এটি একই বেস-ল্যাঙ্গুয়েজ। এটি কেবলমাত্র একটি ছোট্ট বিশদ হিসাবে আপনার পক্ষে গুরুত্বপূর্ণ হতে পারে, বিশেষত এন-ইউএস এবং এন জিবি / এন-সিএ / এন-এউ বা ফ্রি-এফআর / ফ্রি-সিএ একই বিষয় রয়েছে বলে বিবেচনা করে।
উক্তি: আমাদের এটির প্রয়োজন নেই, আমরা কেবল ইংরেজী ভাষায় আমাদের সফ্টওয়্যারটি করি।
উত্তর: হ্যাঁ - তবে কোনটি ??
যাইহোক, আপনি যদি একটি পূর্ণসংখ্যার আইডি ব্যবহার করেন তবে আপনি নমনীয় এবং পরবর্তী সময়ে আপনার পদ্ধতিটি পরিবর্তন করতে পারেন।
এবং আপনার সেই পূর্ণসংখ্যাটি ব্যবহার করা উচিত, কারণ বোটড ডিবি ডিজাইনের চেয়ে বিরক্তিজনক, ধ্বংসাত্মক এবং ঝামেলা আর কিছুই নেই।
আরও দেখুন বোঝায় যা RFC 5646 , আইএসও 639-2 ,
এবং, যদি আপনি এখনও "আমরা" কেবলমাত্র "শুধুমাত্র একটি সংস্কৃতি" (যেমন আমেরিকা যুক্তরাষ্ট্রের মতো) এর জন্য আমাদের অ্যাপ্লিকেশন তৈরি করে থাকি - সুতরাং আমার অতিরিক্ত অতিরিক্ত পূর্ণসংখ্যার প্রয়োজন নেই, তবে এটি উল্লেখ করার জন্য এটি ভাল সময় এবং জায়গা হবে আইএএনএ ভাষার ট্যাগ , তাই না?
কারণ তারা এভাবে চলে:
de-DE-1901
de-DE-1996
এবং
de-CH-1901
de-CH-1996
(১৯৯ in সালে একটি অর্থোগ্রাফিক সংস্কার ছিল ...) অভিধানে কোনও শব্দ ভুল বানান থাকলে এটি অনুসন্ধান করার চেষ্টা করুন; আইনী এবং পাবলিক সার্ভিস পোর্টালগুলির সাথে ডিল করার অ্যাপ্লিকেশনগুলিতে এটি অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে।
আরও গুরুত্বপূর্ণভাবে, এমন অঞ্চলগুলি রয়েছে যা সিরিলিক থেকে লাতিন বর্ণমালায় পরিবর্তিত হচ্ছে, যা কিছু অস্পষ্ট orthography সংস্কারের অতিমাত্রায় উপদ্রব চেয়ে আরও বেশি ঝামেলা হতে পারে, এজন্য আপনি কোন দেশে বাস করছেন তার উপর নির্ভর করে এটিও একটি গুরুত্বপূর্ণ বিবেচ্য বিষয় হতে পারে। একটি উপায় বা অন্য উপায়, কেবল সেখানে যদি সেই পূর্ণসংখ্যাটি রাখা ভাল ...
সম্পাদনা করুন:
এবং ON DELETE CASCADE
পরে যুক্ত করে
REFERENCES dbo.T_Products( PROD_Id )
আপনি কেবল বলতে পারেন:, DELETE FROM T_Products
এবং কোনও বিদেশী কী লঙ্ঘন পাবেন না।
কোলেশন হিসাবে, আমি এটি এর মতো করব:
ক) আপনার নিজস্ব ডাল
খ) ভাষা সারণীতে পছন্দসই কলেজের নাম সংরক্ষণ করুন
আপনি কলিকেশনগুলি তাদের নিজস্ব টেবিলে রাখতে পারেন, যেমন:
SELECT * FROM sys.fn_helpcollations()
WHERE description LIKE '%insensitive%'
AND name LIKE '%german%'
গ) আপনার auth.user.language তথ্যটিতে কলেজের নাম উপলব্ধ রয়েছে
)) আপনার এসকিউএল এভাবে লিখুন:
SELECT
COALESCE(GRP_Name_i18n_cust, GRP_Name_i18n, GRP_Name) AS GroupName
FROM T_Groups
ORDER BY GroupName COLLATE {#COLLATION}
ঙ) তারপরে, আপনি আপনার ডালে এটি করতে পারেন:
cmd.CommandText = cmd.CommandText.Replace("{#COLLATION}", auth.user.language.collation)
যা আপনাকে এই নিখুঁতভাবে রচিত এসকিউএল-কোয়েরি দেবে
SELECT
COALESCE(GRP_Name_i18n_cust, GRP_Name_i18n, GRP_Name) AS GroupName
FROM T_Groups
ORDER BY GroupName COLLATE German_PhoneBook_CI_AI