আমি কীভাবে ডায়নামিকভাবে ওরফে কলামগুলি পারি?


10

আমার একটি টেবিল রয়েছে (আমার দ্বারা ডিজাইন করা হয়নি) যার 20 টির মতো নামযুক্ত কলাম রয়েছে। এটি হ'ল, আপনি কোন ধরণের রেকর্ডটি দেখছেন তার উপর নির্ভর করে কলামটির প্রযোজ্য নামটি পরিবর্তন করতে পারে।

সম্ভাব্য কলামের নামগুলি অন্য টেবিলে সংরক্ষণ করা হয়েছে, যা আমি খুব সহজেই জিজ্ঞাসা করতে পারি।

অতএব, আমি যে ক্যোয়ারীটি সত্যিই সন্ধান করছি তাতে এরকম কিছু ঘটে:

SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type),
       Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type)
FROM   Tbl1 
WHERE  Type = @Type

স্পষ্টতই এটি কাজ করে না, সুতরাং আমি কীভাবে একইরকম ফলাফল পেতে পারি?

' আমি একটি ক্যোয়ারী স্ট্রিং তৈরি এবং EXECUTEএটির চেষ্টা করেছি , তবে এটি কেবল "কমান্ড (গুলি) সফলভাবে সম্পন্ন হয়েছে" প্রত্যাবর্তন করেছে এবং কোনও রোসেটটি ফিরে আসবে বলে মনে হয় না। দেখা যাচ্ছে যে আমি গতিশীল এসকিউএল তৈরি করতে একটি ভুল কোয়েরি ব্যবহার করছি এবং যেমন একটি খালি স্ট্রিং তৈরি হয়েছিল। এসকিউএল সার্ভার অবশ্যই খালি স্ট্রিংটি সঠিকভাবে কার্যকর করেছে।

নোট করুন যে কলামের নামগুলি সহজভাবে কোডিংয়ের পরিবর্তে আমার এটি হওয়ার প্রয়োজন তা হ'ল কলামের নামগুলি ব্যবহারকারী কনফিগারযোগ্য।


1
আপনি যদি ক্যোয়ারী স্ট্রিংটি প্রিন্ট করেন, একটি নতুন ক্যোয়ারী উইন্ডোতে অনুলিপি / পেস্ট করেন এবং সেখানে এটি কার্যকর করেন?
ডেনিসটি

"ব্যবহারকারীর কনফিগারযোগ্য" অর্থ এখানে কয়েকশো বা হাজার হাজার প্রকার রয়েছে এবং / অথবা উপাধিগুলি প্রায়শই পরিবর্তন করা হচ্ছে? যদি উপনামগুলি মোটামুটি স্থিতিশীল হয় তবে আমি ধারাবাহিকভাবে দর্শনের পরামর্শ দেব।
জোন অফ ট্রেডস

@ ডেনিসটি, এটি কোনও কিছুই আউটপুট দেয় না, যা সম্ভবত অন্য কিছুকেও ভুল হিসাবে চিহ্নিত করে। সীসা জন্য ধন্যবাদ।
হটচিপস

@ জোনফএল ট্রেডস দুর্ভাগ্যক্রমে, তারা মোটামুটি স্থিতিশীল থাকা সত্ত্বেও, এটি অনুমানের খুব বেশি অংশ যে ব্যবহারকারী যখন সফ্টওয়্যারটিতে কিছু পরিবর্তন করেন, সেই বিষয়টিকে অবশ্যই প্রতিবেদনে পরিবর্তন করা উচিত।
হটচিপস

@ ডেনিসটি এটি সক্রিয় করে যে ডাইনামিক এসকিউএল তৈরি করতে ব্যবহৃত আমার সাবকিউরিগুলি ভুল ছিল এবং নাল সেটগুলি ফেরত দিয়েছিল। সুতরাং এসকিউএল সার্ভার একটি ফাঁকা কোয়েরি ফিরিয়ে দিয়েছে, যা এটি যথাযথভাবে কার্যকরভাবে কার্যকর করা হয়েছে। PRINT কমান্ড নির্দেশ করার জন্য ধন্যবাদ।
হটচিপস

উত্তর:


12

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

CREATE TABLE #Names
(
    [Type] VARCHAR(50),
    ColNum SMALLINT,
    ColName VARCHAR(50),
    ColDataType VARCHAR(20)
)

INSERT  INTO #Names VALUES
('Customer', 1, 'CustomerID', 'INT'),
('Customer', 2, 'CustomerName', 'VARCHAR(50)'),
('Customer', 3, 'CustomerJoinDate', 'DATE'),
('Customer', 4, 'CustomerBirthDate', 'DATE'),
('Account', 1, 'AccountID', 'INT'),
('Account', 2, 'AccountName', 'VARCHAR(50)'),
('Account', 3, 'AccountOpenDate', 'DATE'),
('CustomerAccount', 1, 'CustomerID', 'INT'),
('CustomerAccount', 2, 'AccountID', 'INT'),
('CustomerAccount', 3, 'RelationshipSequence', 'TINYINT')


CREATE TABLE #Data
(
    [Type] VARCHAR(50),
    Col1 VARCHAR(50),
    Col2 VARCHAR(50),
    Col3 VARCHAR(50),
    Col4 VARCHAR(50),
    Col5 VARCHAR(50),
    Col6 VARCHAR(50),
    Col7 VARCHAR(50)
)

INSERT  INTO #Data VALUES
('Customer', '1', 'Mr John Smith', '2005-05-20', '1980-11-15', NULL, NULL, NULL),
('Customer', '2', 'Mrs Hayley Jones', '2009-10-10', '1973-04-03', NULL, NULL, NULL),
('Customer', '3', 'ACME Manufacturing Ltd', '2012-12-01', NULL, NULL, NULL, NULL),
('Customer', '4', 'Mr Michael Crocker', '2014-01-13', '1957-01-23', NULL, NULL, NULL),
('Account', '1', 'Smith-Jones Cheque Acct', '2005-05-25', NULL, NULL, NULL, NULL),
('Account', '2', 'ACME Business Acct', '2012-12-01', NULL, NULL, NULL, NULL),
('Account', '3', 'ACME Social Club', '2013-02-10', NULL, NULL, NULL, NULL),
('Account', '4', 'Crocker Tipping Fund', '2014-01-14', NULL, NULL, NULL, NULL),
('CustomerAccount', '1', '1', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '1', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '3', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '2', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '3', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '2', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '4', '1', NULL, NULL, NULL, NULL)


DECLARE @Type VARCHAR(50) = 'Account' -- Or Customer, or CustomerAccount

DECLARE @SQLText NVARCHAR(MAX) = ''

SELECT  @SQLText += 'SELECT '

SELECT  @SQLText += ( -- Add in column list, with dynamic column names.
                SELECT  'CONVERT(' + ColDataType + ', Col' + CONVERT(VARCHAR, ColNum) + ') AS [' + ColName + '],'
                FROM    #Names
                WHERE   [Type] = @Type FOR XML PATH('')
            )

SELECT  @SQLText = LEFT(@SQLText, LEN(@SQLText) - 1) + ' ' -- Remove trailing comma

SELECT  @SQLText += 'FROM #Data WHERE [Type] = ''' + @Type + ''''

PRINT   @SQLText
EXEC    sp_executesql @SQLText

এটি নির্বাচনের বিবৃতি প্রদান করে: SELECT CONVERT(INT, Col1) AS [AccountID],CONVERT(VARCHAR(50), Col2) AS [AccountName],CONVERT(DATE, Col3) AS [AccountOpenDate] FROM #Data WHERE [Type] = 'Account'


ডায়নামিক এসকিউএল ব্যবহার করা হ'ল সঠিক উত্তর, প্রশ্নটি কীভাবে এসকিউএল দিয়ে এটি করবেন তা জিজ্ঞাসা করা হয়েছে। এটিও এমন কিছু ছিল যা আমি করার চেষ্টা করেছি, তবে ভুলভাবে।
হটচিপস

মন যে যদি আপনি ব্যবহারকারীর ইনপুট গ্রহণ এবং এটি ব্যবহার গতিশীল এসকিউএল গড়ে তুলতে হয়, তাহলে আপনি সত্যিই রাখবেন সত্যিই এসকিউএল ইনজেকশন এবং sanitizing ইনপুট নিয়ে উদ্বিগ্ন করা প্রয়োজন। bobi-tables.com
জোনাথন ভ্যান

নিখুঁতভাবে জনাথনভানম্যাট্রে ভাগ্যক্রমে, এটি কেবল অভ্যন্তরীণ ব্যবহারের জন্য, এবং অ্যাপ্লিকেশনটির মাধ্যমে সমস্ত ইনপুট ইতিমধ্যে স্যানিটাইজড রয়েছে।
হটচিপস

7

এটি একটি ফ্রন্ট এন্ড ডিসপ্লে সমাধানের জন্য প্রধান শোনায়। কোয়েরি 1 আপনার ডেটা পিছনে টেনে তুলবে, কোয়েরি 2 কলামের নামগুলি এবং কোডগুলিতে পিছনে ফিরে আসবে যখন আপনি যখন কোনও কাঠামোটি প্রদর্শন করতে ব্যবহার করেন আপনি দ্বিতীয় ক্যোয়ারী থেকে শিরোনাম সেট করে।

যখন একটি বিশুদ্ধ এসকিউএল পদ্ধতি সম্ভব হতে পারে এটি গতিশীল এসকিউএল এবং কোড রক্ষণাবেক্ষণ একটি দুঃস্বপ্ন হতে পারে।

এছাড়াও আপনি সম্ভবত খুঁজছেন sp_executesqlএবং ঠিক EXECUTE N'Query String'তেমন নয় যে আপনার কমান্ডের সমস্যাটি সফলভাবে সম্পন্ন করতে পারে।


আমি সম্মত, এবং আমি স্পষ্টতই এসএসআরএসে এটি করতে পারি, তবে আমি এই মুহুর্তে অন্যান্য প্রতিবেদনের সফটওয়্যারটি ব্যবহার করছি না।
হটচিপস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.