সঞ্চিত পদ্ধতির ফলাফল সেট থেকে কলামগুলি নির্বাচন করুন


447

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

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

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

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

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

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

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

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

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

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

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

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

    'এক্সিকিউট' কীওয়ার্ডটির নিকটে ভুল সিনট্যাক্স।


কৌতূহলের বাইরে, এই ক্যোয়ারীটি কি কাজ করে: এক্সেক মাইস্টোরডপ্রোক থেকে 'সিলেক্ট করুন' 'পরম 1', 'প্যারাম 2' যদি তাই হয় তবে ফলাফল সেটে কোন কলামের নাম প্রদর্শিত হবে এবং আপনি কি নির্বাচিত তালিকায় সেই কলামের নামগুলি ব্যবহার করতে পারবেন?
ডেভ কোস্টা

5
আমি এর জন্য কোনও উত্তর পাই না।
রসিনি

32
আচ্ছা আপনি কখনও খুব গুরুত্বপূর্ণ প্রশ্নের উত্তর দেন নি! আপনি কোন এসকিউএল প্ল্যাটফর্মের বিষয়ে জিজ্ঞাসা করছেন? মাইএসকিউএল, মাইক্রোসফ্ট এসকিউএল সার্ভার, ওরাকল ইত্যাদি me এটি আমার কাছে এটি এসকিউএল সার্ভারের মতো লাগে তবে আপনার লোকদের বলা দরকার বা তারা নির্ভরযোগ্যভাবে আপনার প্রশ্নের উত্তর দিতে পারবেন না।
জেএমটাইলার

6
ঠিক আছে, এটি এমএস-এসকিউএল হতে হবে। EXECকোনও মাইএসকিউএল কীওয়ার্ড নয় (মাইএসকিউএল সমতুল্য বিবৃতি প্রস্তুত )। যদিও আমি মাইএসকিউএলের উত্তর জানতে চাই, নীচের উত্তরগুলি টি-এসকিউএল লক্ষ্য করে। Retagging।
বোবোবোবো

1
আমি এর কোনও উত্তর পাই না
রসিনি

উত্তর:


186

আপনি কোয়েরি বিভক্ত করতে পারেন? সঞ্চিত প্রোক ফলাফলগুলি একটি সারণী ভেরিয়েবল বা একটি টেম্প সারণিতে সন্নিবেশ করান। তারপরে, সারণী ভেরিয়েবল থেকে 2 টি কলাম নির্বাচন করুন।

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

SELECT col1, col2 FROM @tablevar

27
আপনি যখন সারণির সংজ্ঞাটি জানেন না তখন এটি কাজও করে না
ইয়ান বয়ড

এই ধরণের সম্পর্কে জানতাম না। তারা টেম্প টেবিল হিসাবে একই বাস্তবায়ন করা হয়? নাকি স্মৃতিতে কঠোরভাবে?
d -_- বি

এটি আকর্ষণীয় ছিল: sqlnerd.blogspot.com/2005/09/…
d -_- বি

টেম্প টেবিলের সরবরাহকৃত কলামগুলির সংখ্যা যদি সঞ্চিত পদ্ধতির আউটপুটে একই থাকে তবে এটি ঠিক আছে। chagbert।
ছাগবার্ট

83

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

সঞ্চিত পদ্ধতিগুলির মধ্যে ডেটা কীভাবে ভাগ করবেন

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


1
আমি মনে করি যে এই লিঙ্কে ওপেনকুরি পরামর্শটি ওপি যা খুঁজছে তার থেকে অনেক বেশি কাছাকাছি।
করিন

80
CREATE TABLE #Result
(
  ID int,  Name varchar(500), Revenue money
)
INSERT #Result EXEC RevenueByAdvertiser '1/1/10', '2/1/10'
SELECT * FROM #Result ORDER BY Name
DROP TABLE #Result

সূত্র:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/


নিখুঁত 2014 সালে আপনি এসকিউএল সার্ভার 2000 এ কী করছেন?
জন জাব্রোস্কি

1
উত্তরাধিকার ব্যবস্থা সহ বড় বড় কর্পোরেশন: ডি
লফালহ্যাকার

39

এটি আমার জন্য কাজ করে: (অর্থাত কেবল আমার কাছে 30++ এর 2 টি কলাম দরকার sp_help_job)

SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, 
  'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB''');  

এটি কাজ করার আগে আমার এটি চালানো দরকার:

sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;

.... sys.serversটেবিল আপডেট করতে । (যেমন ওপেনকুয়েরির মধ্যে একটি স্ব-রেফারেন্স ব্যবহার করা ডিফল্টরূপে অক্ষম বলে মনে হচ্ছে))

আমার সাধারণ প্রয়োজনের জন্য, আমি ল্যান্সের দুর্দান্ত লিঙ্কের খোলার অংশে বর্ণিত সমস্যার কোনওটির মধ্যেই দৌড়াতে পারি না ।

রসিনি, যদি আপনাকে এই ইনপুট প্যারামিটারগুলি গতিশীলভাবে সেট করার দরকার হয়, তবে ওপেনকুয়েরির ব্যবহারটি আরও কিছুটা মজাদারভাবে হয়ে যায়:

DECLARE @innerSql varchar(1000);
DECLARE @outerSql varchar(1000);

-- Set up the original stored proc definition.
SET @innerSql = 
'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ;

-- Handle quotes.
SET @innerSql = REPLACE(@innerSql, '''', '''''');

-- Set up the OPENQUERY definition.
SET @outerSql = 
'SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');';

-- Execute.
EXEC (@outerSql);

আমি sp_serveroptionবিদ্যমান sys.serversস্ব-রেফারেন্সটি সরাসরি আপডেট করতে , বনাম ব্যবহার করে ব্যবহারের মধ্যে পার্থক্য (যদি থাকে) সম্পর্কে নিশ্চিত নইsp_addlinkedserver (ড্যান্সকেট / ওরফে তৈরির জন্য ল্যান্সের লিঙ্কে বর্ণিত) ।

দ্রষ্টব্য 1: আমি ওপেনরোউসেটের চেয়ে ওপেনকোয়ারি পছন্দ করি, প্রদত্ত যে ওপেনকোয়ারিটির জন্য প্রোকের মধ্যে সংযোগ-স্ট্রিং সংজ্ঞাটির প্রয়োজন হয় না।

দ্রষ্টব্য 2: এগুলি সব বলেছিলেন: সাধারণত আমি কেবল সন্নিবেশ করতাম ... এক্সেক :) হ্যাঁ, এটি 10 ​​মিনিটের অতিরিক্ত টাইপিংয়ের কাজ, তবে আমি যদি এটি সহায়তা করতে পারি তবে আমি এগুলির সাথে ঝাঁকুনি দেওয়া পছন্দ করি না:
(ক) এর মধ্যে উদ্ধৃতিগুলির মধ্যে উদ্ধৃতিগুলি উদ্ধৃতিগুলি এবং
(খ) সিস টেবিলগুলি এবং / অথবা স্নিগ্ধ স্ব-রেফারেন্সিং লিঙ্কযুক্ত সার্ভার সেটআপগুলি (যেমন এর জন্য, আমাকে আমার সর্বশক্তিমান ডিবিএতে আমার মামলা করা প্রয়োজন :)

তবে এই উদাহরণে, আমি কোনও INSERT ... এক্সইসি কনস্ট্রাক্ট ব্যবহার করতে পারি নি, যেমনটি sp_help_jobইতিমধ্যে একটি ব্যবহার করছে। ("একটি সংক্ষিপ্ত বিবরণী বিবৃতি নেস্ট করা যায় না" ")


3
ডাইনামিক-
এসকিএল

আমার কাজ শেষ হয়েছে কিনা তা খতিয়ে দেখা দরকার। "একটি INSERT EXEC বিবৃতি নেস্ট করা যাবে না"। আমি আপনাকে মাইক্রোসফ্ট ঘৃণা করি।
অ্যালেক্সকোভেলস্কি

11

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

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

এখন পদ্ধতিটি কার্যকর করুন এবং এতে মান দিন #test_table:

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

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

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

2
টেবিল ভেরিয়েবলের পরিবর্তে কোনও টেম্প টেবিল তৈরি করার সুবিধা রয়েছে কি?
ডেভ কেলি

1
স্ট্যাকওভারফ্লোতে আমি খুঁজে পেয়েছি সেরা সমাধান! :)
উমার

4
অন্যান্য সঞ্চিত পদ্ধতি থেকে আমার যদি কেবল একটি কলামের প্রয়োজন হয় তবে কী হবে?
কেভাল প্যাটেল

11

আপনি যদি আপনার সঞ্চিত পদ্ধতিটি পরিবর্তন করতে সক্ষম হন তবে প্রয়োজনীয় পাতাগুলি সংজ্ঞাগুলি সহজেই প্যারামিটার হিসাবে রাখতে পারেন এবং একটি স্বয়ংক্রিয়ভাবে তৈরি অস্থায়ী টেবিল ব্যবহার করতে পারেন:

CREATE PROCEDURE sp_GetDiffDataExample
      @columnsStatement NVARCHAR(MAX) -- required columns statement (e.g. "field1, field2")
AS
BEGIN
    DECLARE @query NVARCHAR(MAX)
    SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable'
    EXEC sp_executeSql @query
    SELECT * FROM ##TempTable
    DROP TABLE ##TempTable
END

এই ক্ষেত্রে আপনাকে ম্যানুয়ালি একটি টেম্প টেবিল তৈরি করার দরকার নেই - এটি স্বয়ংক্রিয়ভাবে তৈরি করা হয়। আশাকরি এটা সাহায্য করবে.


## সারণীগুলি সেশনের মধ্যে ভাগ করার সাথে সাথে সতর্কতা অবলম্বন করুন
ইকেলভিন

1
আপনি ## # মধ্যে এবং টেবিল পার্থক্য জন্য একটি সংক্ষিপ্ত বর্ণনা জানতে পারেন stackoverflow.com/a/34081438/352820
eKelvin

এটি কি এসকিউএল ইঞ্জেকশন প্রবণ?
বুশরদ

11

এটি কেন এত কঠিন তা জানার জন্য এটি সহায়ক হতে পারে। সঞ্চিত পদ্ধতিটি কেবল পাঠ্য (প্রিন্ট 'পাঠ্য') ফেরত দিতে পারে, বা একাধিক টেবিল ফেরত দিতে পারে, বা কোনও টেবিল ফেরত দিতে পারে না।

সুতরাং মত কিছু SELECT * FROM (exec sp_tables) Table1 কাজ করবে না


12
যদি এটি ঘটে তবে এসকিউএল সার্ভার একটি ত্রুটি বাড়াতে বিনামূল্যে। উদাহরণস্বরূপ, যদি আমি এমন একটি সাবকোয়ারি লিখি যা একাধিক মান প্রদান করে। হ্যাঁ এটা করতে ঘটতে, কিন্তু বাস্তবে এটা না। এমনকি যদি তা করেও থাকে: ত্রুটি বাড়াতে অসুবিধা হয় না।
ইয়ান বয়ড

8

(ধরে নিচ্ছেন এসকিউএল সার্ভার)

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


1
এর জন্য সারণির সংজ্ঞাটি জানা দরকার। দরকারী নয়।
ট্রায়ঙ্কো

8

একটি দ্রুত হ্যাক হ'ল নতুন প্যারামিটার যুক্ত '@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

7

আপনি যদি ডেটাটির ম্যানুয়াল বৈধতার জন্য এটি করছেন, আপনি লিনকুইপ্যাড দিয়ে এটি করতে পারেন।

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

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


7

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

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

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

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;

এটাই!


এই জন্য, টেবিল সংজ্ঞা একটি অনুলিপি তৈরি করা প্রয়োজন। এটি এড়ানোর কোনও উপায় আছে কি?
হার্ডিক

7

যেমনটি প্রশ্নটিতে উল্লেখ করা হয়েছে, সঞ্চিত প্রক্রিয়া চালানোর আগে 80 টি কলামের টেম্প টেবিলটি নির্ধারণ করা শক্ত।

সুতরাং এটির অন্যান্য উপায়টি হ'ল সঞ্চিত প্রক্রিয়া ফলাফলের ফলাফলের উপর ভিত্তি করে সারণীটি তৈরি করা।

SELECT * INTO #temp FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;'
                                   ,'EXEC MyStoredProc')

আপনি যদি কোনও ত্রুটি পেয়ে থাকেন তবে নিম্নলিখিত কোয়েরি সম্পাদন করে আপনার অ্যাডহক বিতরণ ক্যোয়ারী সক্ষম করতে হবে।

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

চালানো sp_configureউভয় পরামিতি সঙ্গে একটি কনফিগারেশন অপশন পরিবর্তন করতে বা চালানোর জন্য RECONFIGUREবিবৃতি, আপনি প্রদান করা আবশ্যকALTER SETTINGS সার্ভার পর্যায়ের অনুমতি

এখন আপনি উত্পন্ন টেবিল থেকে আপনার নির্দিষ্ট কলামগুলি নির্বাচন করতে পারেন

SELECT col1, col2
FROM #temp

4

এটা চেষ্টা কর

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

1
লোল - সে করেনি। তিনি এটিকে সঞ্চিত পদ্ধতির অনুরোধে কোড করেছিলেন, যেখানে নেটওয়ার্ক স্নিফিংয়ের মাধ্যমে এটি ডাটাবেসে অ্যাক্সেস না করে আরও সহজেই পাওয়া যায়।
মার্টিন মিলান

গিথুব থেকেও বেরিয়ে আসা বেশ সহজ।
নাম

3

আমি জানি এসপি থেকে এক্সিকিউট করা এবং টেম্প টেবিল বা টেবিল ভেরিয়েবলের মধ্যে sertোকানো একটি বিকল্প হবে তবে আমি মনে করি না এটি আপনার প্রয়োজন। আপনার প্রয়োজন অনুসারে এই নীচের ক্যোয়ারী বিবৃতিটিতে কাজ করা উচিত:

Declare @sql nvarchar(max)
Set @sql='SELECT   col1, col2 FROM OPENROWSET(''SQLNCLI'', ''Server=(local);uid=test;pwd=test'',
     ''EXEC MyStoredProc ''''param1'''', ''''param2'''''')'
 Exec(@sql)

আপনার যদি বিশ্বাসযোগ্য সংযোগ থাকে তবে নীচে কোয়েরির বিবৃতিটি ব্যবহার করুন:

Declare @sql nvarchar(max)
Set @sql='SELECT   col1, col2 FROM OPENROWSET(''SQLNCLI'', ''Server=(local);Trusted_Connection=yes;'',
     ''EXEC MyStoredProc ''''param1'''', ''''param2'''''')'
 Exec(@sql)

যদি আপনি উপরের বিবৃতিটি চালাতে ত্রুটি পেয়ে থাকেন তবে কেবল নীচে এই বিবৃতিটি চালান:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

আমি আশা করি এটি এমন কাউকে সহায়তা করবে যারা এই জাতীয় অনুরূপ সমস্যার মুখোমুখি হবে। যদি কেউ টেম্প টেবিল বা টেবিল ভেরিয়েবলের সাথে চেষ্টা করতে চায় যা নীচের মতো হওয়া উচিত তবে এই দৃশ্যে আপনার এসপি কতটি কলাম ফিরে আসবে তা জানতে হবে তবে আপনাকে টেম্প টেবিল বা সারণী ভেরিয়েবলের মধ্যে এতগুলি কলাম তৈরি করতে হবে:

--for table variable 
Declare @t table(col1 col1Type, col2 col2Type)
insert into @t exec MyStoredProc 'param1', 'param2'
SELECT col1, col2 FROM @t

--for temp table
create table #t(col1 col1Type, col2 col2Type)
insert into #t exec MyStoredProc 'param1', 'param2'
SELECT col1, col2 FROM #t

1

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

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

দ্রষ্টব্য: এসপি আপডেট করতে বা কনফিগারেশন পরিবর্তন করতে এবং ব্যবহার করতে ইচ্ছুক হলে আরও অনেক ভাল, আরও সার্বজনীন সমাধানগুলি কোডের কম লাইনগুলির সাথে কাজ করবে 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)

0

আপনার যদি কেবল একবারে প্রয়োজন হয় তবে এটি করার সহজ উপায়:

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


4
সঞ্চিত সংগ্রহ তৈরির পুরো বিন্দু পুনঃব্যবহারযোগ্যতা। আপনার উত্তর সম্পূর্ণরূপে এর বিরোধিতা করে।
DeutschZuid

6
আসল পোস্টে ডয়চজুইডের বিরুদ্ধে লড়াই করার জন্য, তিনি এটিকে পুনরায় ব্যবহার করতে চান কিনা বা তিনি কেবল কোনও সঞ্চিত প্রক্টের ফলাফলগুলি দেখার চেষ্টা করছেন কিনা তা উল্লেখ করেন না। মার্টিন ঠিক বলেছেন, এটি কেবল একবার করার প্রয়োজন হলে এটি সম্ভবত সবচেয়ে সহজ উপায়।
বিশপ

0

একটি গতিশীল দর্শন তৈরি করুন এবং এ থেকে ফলাফল পান .......

CREATE PROCEDURE dbo.usp_userwise_columns_value
(
    @userid BIGINT
)
AS 
BEGIN
        DECLARE @maincmd NVARCHAR(max);
        DECLARE @columnlist NVARCHAR(max);
        DECLARE @columnname VARCHAR(150);
        DECLARE @nickname VARCHAR(50);

        SET @maincmd = '';
        SET @columnname = '';
        SET @columnlist = '';
        SET @nickname = '';

        DECLARE CUR_COLUMNLIST CURSOR FAST_FORWARD
        FOR
            SELECT columnname , nickname
            FROM dbo.v_userwise_columns 
            WHERE userid = @userid

        OPEN CUR_COLUMNLIST
        IF @@ERROR <> 0
            BEGIN
                ROLLBACK
                RETURN
            END   

        FETCH NEXT FROM CUR_COLUMNLIST
        INTO @columnname, @nickname

        WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @columnlist = @columnlist + @columnname + ','

                FETCH NEXT FROM CUR_COLUMNLIST
                INTO @columnname, @nickname
            END
        CLOSE CUR_COLUMNLIST
        DEALLOCATE CUR_COLUMNLIST  

        IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'v_userwise_columns_value')
            BEGIN
                SET @maincmd = 'CREATE VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END
        ELSE
            BEGIN
                SET @maincmd = 'ALTER VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END

        --PRINT @maincmd
        EXECUTE sp_executesql @maincmd
END

-----------------------------------------------
SELECT * FROM dbo.v_userwise_columns_value

-1

আমি আসল এসপি কেটে পেস্ট করব এবং আপনার পছন্দ মতো 2 ব্যতীত সমস্ত কলাম মুছে ফেলব। অথবা। আমি ফলাফলটি সেট করে ফিরিয়ে আনব, এটি একটি যথাযথ ব্যবসায়ের উদ্দেশ্যে মানচিত্র করব, তারপরে দুটি কলামটি লিনকিউ করব।


1
লোকেরা এটি করে না। এটি DRY নীতি লঙ্ঘন করবে। জিনিসগুলি যখন পরিবর্তিত হয়, তা না হলেও, আপনাকে এখন সমস্ত স্থানে আপনার পরিবর্তনগুলি ট্র্যাক ডাউন এবং ইনপুট করতে হবে।
jriver27
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.