sql server - সংরক্ষিত পদ্ধতির ফলাফল সেট থেকে কলাম নির্বাচন করুন




sql-server tsql (11)

আমার একটি সংরক্ষিত পদ্ধতি রয়েছে যা 80 কলাম এবং 300 সারি প্রদান করে। আমি একটি নির্বাচন লিখতে চাই যে 2 কলাম পায়। কিছুটা এইরকম

SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'

যখন আমি উপরের সিনট্যাক্স ব্যবহার করি তখন আমি ত্রুটিটি পাই:

"অবৈধ কলামের নাম"।

আমি জানি সবচেয়ে সহজ সমাধান সংরক্ষিত পদ্ধতি পরিবর্তন করতে হবে, কিন্তু আমি এটি লিখিনি, এবং আমি এটি পরিবর্তন করতে পারছি না।

আমি কি করতে চান কোন উপায় আছে?

  • আমি ফলাফল রাখতে একটি টেম্প টেবিল তৈরি করতে পারি, কিন্তু 80 টি কলাম আছে তাই আমাকে কলামের জন্য মাত্র 80 কলাম টেম্প টেবিল তৈরি করতে হবে। আমি ফিরে আসা সব কলাম ট্র্যাকিং এড়াতে চেয়েছিলেন।

  • আমি WITH SprocResults AS .... ব্যবহার করে চেষ্টা করেছি WITH SprocResults AS .... মার্ক দ্বারা প্রস্তাবিত, কিন্তু আমি 2 ত্রুটি পেয়েছিলাম

    শব্দ 'EXEC' এর কাছাকাছি ভুল সিনট্যাক্স।
    ভুল বাক্য গঠন কাছাকাছি ')'.

  • আমি একটি টেবিল পরিবর্তনশীল ঘোষণা করার চেষ্টা করেছি এবং আমি নিম্নলিখিত ত্রুটি পেয়েছিলাম

    সন্নিবেশ ত্রুটি: কলামের নাম বা সরবরাহকৃত মানগুলির সংখ্যা টেবিলে সংজ্ঞা মেলে না

  • আমি চেষ্টা করি
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    আমি ত্রুটি পেতে:

    শব্দ 'exec' কাছাকাছি ভুল সিনট্যাক্স।


(এসকিউএল সার্ভার অনুমান)

টি-এসকিউএল-এ একটি সংরক্ষিত পদ্ধতির ফলাফলগুলির সাথে কাজ করার একমাত্র উপায় INSERT INTO ... EXEC ব্যবহার করতে হয় INSERT INTO ... EXEC সিনট্যাক্স। এটি আপনাকে একটি টেম্প টেবিল বা একটি টেবিল পরিবর্তনশীল এবং আপনার প্রয়োজনীয় ডেটা নির্বাচন করে দেওয়ার বিকল্প দেয়।


আপনি কি প্রশ্নটি বিভক্ত করতে পারেন? একটি টেবিল পরিবর্তনশীল বা একটি টেম্প টেবিল মধ্যে সংরক্ষিত প্রসেস ফলাফল সন্নিবেশ করান। তারপর, টেবিল পরিবর্তনশীল থেকে 2 কলাম নির্বাচন করুন।

Declare @tablevar table(col1 col1Type,..
insert into @tablevar(col1,..) exec MyStoredProc 'param1', 'param2'

SELECT col1, col2 FROM @tablevar

আপনি যদি তথ্য ম্যানুয়াল যাচাইকরণের জন্য এটি করছেন, আপনি LINQPad এর সাথে এটি করতে পারেন।

লিংকপ্যাডে ডাটাবেসের সাথে একটি সংযোগ তৈরি করুন তারপর সি # বিবৃতিগুলি নিম্নরূপঃ তৈরি করুন:

DataTable table = MyStoredProc (param1, param2).Tables[0];
(from row in table.AsEnumerable()
 select new
 {
  Col1 = row.Field<string>("col1"),
  Col2 = row.Field<string>("col2"),
 }).Dump();

রেফারেন্স http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx সংস্থাপিত - http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx অ্যাক্সেসিং- A- http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx


আপনি শুধুমাত্র এই একবার প্রয়োজন হলে সহজ উপায়:

আমদানি এবং রপ্তানি উইজার্ডে এক্সেল এক্সপোর্ট করুন এবং তারপরে এই এক্সেলটি একটি টেবিলে আমদানি করুন।


একটি দ্রুত হ্যাক একটি নতুন প্যারামিটার '@Column_Name' যোগ করা হবে এবং কলিং ফাংশন কলামের নামটি পুনরুদ্ধার করতে সংজ্ঞায়িত করবে। আপনার স্প্রোকের ফিরতি অংশে, যদি আপনার / অন্য বিবৃতি থাকে এবং শুধুমাত্র নির্দিষ্ট কলামটি ফেরত দেয়, বা খালি থাকে তবে - সমস্ত ফেরত দিন।

CREATE PROCEDURE [dbo].[MySproc]
        @Column_Name AS VARCHAR(50)
AS
BEGIN
    IF (@Column_Name = 'ColumnName1')
        BEGIN
            SELECT @ColumnItem1 as 'ColumnName1'
        END
    ELSE
        BEGIN
            SELECT @ColumnItem1 as 'ColumnName1', @ColumnItem2 as 'ColumnName2', @ColumnItem3 as 'ColumnName3'
        END
END

এখানে আপনার সমস্যার সমাধান করার বিভিন্ন উপায়ে ব্যাখ্যা করা একটি চমত্কার ভাল নথির একটি লিঙ্ক রয়েছে (যদিও তাদের মধ্যে অনেকেই ব্যবহার করা যাবে না যেহেতু আপনি বিদ্যমান সংরক্ষিত পদ্ধতিটি সংশোধন করতে পারবেন না।)

সংরক্ষিত পদ্ধতির মধ্যে তথ্য শেয়ার করুন

গুলজারের উত্তরটি কাজ করবে (এটি উপরের লিঙ্কটিতে নথিবদ্ধ করা আছে) তবে এটি লিখার ঝামেলা হবে (আপনার @tablevar (col1, ...) বিবৃতিতে আপনাকে 80 টি কলামের নাম উল্লেখ করতে হবে। এবং ভবিষ্যতে যদি কোন কলাম স্কিমাতে যোগ করা হয় বা আউটপুট পরিবর্তিত হয় তবে এটি আপনার কোডে আপডেট করা দরকার বা এটি ত্রুটিযুক্ত হবে।


এটা চেষ্টা কর

use mydatabase
create procedure sp_onetwothree as
select 1 as '1', 2 as '2', 3 as '3'
go
SELECT a.[1], a.[2]
FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass',
    'exec mydatabase.dbo.sp_onetwothree') AS a
GO

এটি অর্জন করতে, প্রথমে আপনি নীচের মত #test_table তৈরি করুন:

create table #test_table(
    col1 int,
    col2 int,
   .
   .
   .
    col80 int
)

এখন প্রক্রিয়াটি কার্যকর করুন এবং #test_table মান #test_table :

insert into #test_table
EXEC MyStoredProc 'param1', 'param2'

এখন আপনি #test_table থেকে মান #test_table :

select col1,col2....,col80 from #test_table

এসকিউএল 2012 বা তার পরে যে কেউ আছে, আমি সঞ্চিত পদ্ধতিগুলির সাথে এটি সম্পাদন করতে সক্ষম ছিলাম এবং প্রতিটি সময় একই কলাম আউটপুট আছে।

সাধারণ ধারণাটি হল আমি তৈরি করি, সন্নিবেশ করানো, নির্বাচন, এবং টেম্প টেবিলের ড্রপ করার জন্য গতিশীল অনুসন্ধান তৈরি করি এবং এটি সমস্ত জেনারেট করার পরে এটি কার্যকর করি। আমি ক্রমান্বয়ে সঞ্চিত পদ্ধতি থেকে কলামের নাম এবং প্রকারগুলি পুনরুদ্ধার করে টেম্প টেবিল জেনারেট করি।

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

DECLARE @spName VARCHAR(MAX) = 'MyStoredProc'
DECLARE @tempTableName VARCHAR(MAX) = '#tempTable'

-- might need to update this if your param value is a string and you need to escape quotes
DECLARE @insertCommand VARCHAR(MAX) = 'INSERT INTO ' + @tempTableName + ' EXEC MyStoredProc @param=value'

DECLARE @createTableCommand VARCHAR(MAX)

-- update this to select the columns you want
DECLARE @selectCommand VARCHAR(MAX) = 'SELECT col1, col2 FROM ' + @tempTableName

DECLARE @dropCommand VARCHAR(MAX) = 'DROP TABLE ' + @tempTableName

-- Generate command to create temp table
SELECT @createTableCommand = 'CREATE TABLE ' + @tempTableName + ' (' +
    STUFF
    (
        (
            SELECT ', ' + CONCAT('[', name, ']', ' ', system_type_name)
            FROM sys.dm_exec_describe_first_result_set_for_object
            (
              OBJECT_ID(@spName), 
              NULL
            )
            FOR XML PATH('')
        )
        ,1
        ,1
        ,''
    ) + ')'

EXEC( @createTableCommand + ' '+ @insertCommand + ' ' + @selectCommand + ' ' + @dropCommand)

এসকিউএল সার্ভারের জন্য, আমি এটি সূক্ষ্ম কাজ করে দেখতে পাচ্ছি:

একটি টেম্প টেবিল তৈরি করুন (অথবা স্থায়ী টেবিল, সত্যিই কোন ব্যাপার না), এবং সংরক্ষিত পদ্ধতির বিরুদ্ধে বিবৃতিতে সন্নিবেশ করান। এসপি এর ফলাফল সেটটি আপনার টেবিলে কলামের সাথে মেলে, অন্যথায় আপনি একটি ত্রুটি পাবেন।

এখানে একটি উদাহরণ:

DECLARE @temp TABLE (firstname NVARCHAR(30), lastname nvarchar(50));

INSERT INTO @temp EXEC dbo.GetPersonName @param1,@param2;
-- assumption is that dbo.GetPersonName returns a table with firstname / lastname columns

SELECT * FROM @temp;

এটাই!






stored-procedures