একটি অস্থায়ী সারণীতে একটি সঞ্চিত পদ্ধতির ফলাফল সন্নিবেশ করান


1577

আমি কীভাবে করব SELECT * INTO [temp table] FROM [stored procedure]? না FROM [Table]এবং সংজ্ঞায়িত না করে [temp table]?

Selectথেকে সমস্ত ডেটা BusinessLineমধ্যে tmpBusLineকাজ জরিমানা।

select *
into tmpBusLine
from BusinessLine

আমি একই চেষ্টা করছি, কিন্তু একটি stored procedureযে তথ্য ফেরত ব্যবহার করে, বেশ একই নয়।

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

আউটপুট বার্তা:

এমএসজি 156, স্তর 15, রাজ্য 1, লাইন 2 'এক্সিকিউটর' কীওয়ার্ডের নিকটে ভুল সিনট্যাক্স।

আমি আউটপুট স্টোরেজ পদ্ধতি হিসাবে একই কাঠামো সহ অস্থায়ী টেবিল তৈরির বেশ কয়েকটি উদাহরণ পড়েছি, যা ভাল কাজ করে, তবে কোনও কলাম সরবরাহ না করা ভাল লাগবে nice


22
[সারণীর নাম] এর মধ্যে নির্বাচন করুন * এর মাধ্যমে কলামগুলি মূল টেবিল থেকে অনুলিপি করা হয়েছে তা আপনি জানেন। আমি যদি স্টোরেজ পদ্ধতির বিপরীতে একই জিনিসটি করতে চাই তবে আমি ঠিক এটি চাই।
ফেরদীন

2
দেখুন sommarskog.se/share_data.html এবং আমার পোস্ট stackoverflow.com/questions/6215672/...
Triynko

7
কেবল এটি চিহ্নিত করতে চাই যে "টিএমপিবাসলাইনতে * নির্বাচন করুন" একটি স্থায়ী সারণী তৈরি করে। আপনি সম্ভবত "টেম্পব্লাসলাইনে * নির্বাচন করুন" চান। আমি নিশ্চিত যে মূল পোস্টারটি ইতিমধ্যে এটি খুঁজে পেয়েছে তবে এটি অন্যদের এই পোস্টটি খুঁজে পেতে সহায়তা করতে পারে কারণ এটি "টেম্প টেবিলের মধ্যে নির্বাচন করুন" অনুসন্ধানের শীর্ষ ফলাফল হিসাবে রয়েছে
কেটাম 33

2
আমি জানি না এটি সম্বোধন করা হয়েছে কি না তবে আপনি কী কারণে ত্রুটিটি পেয়েছেন তা কীওয়ার্ড থেকে এসেছে the
ওয়েস পামার

9
মাইক্রোসফ্টকে এক্সেক থেকে নির্বাচন করুন * যুক্ত করতে হবে! অনুগ্রহ!
kjmerf

উত্তর:


704

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

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

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

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

28
এটি করার সঠিক উপায় এটি। ওপেনরোউসেটটি সঞ্চিত পদ্ধতির ফলাফলগুলিকে টেবিলের অভিব্যক্তি হিসাবে চিকিত্সার একমাত্র উপায়।
রব ফারলে 13

37
এটি একটি টেবিলের মধ্যে সন্নিবেশ করানোর জন্য কিছুটা জটিল বলে মনে হচ্ছে। অনেকগুলি কনফিগার করতে হবে। এছাড়াও আমি যখন এটি চেষ্টা করেছিলাম তখন "এমএসজি 7357, স্তর 16, রাজ্য 2, লাইন 1" EXEC getPartyAnalysisData 146 "অবজেক্টটি প্রক্রিয়া করতে পারছে না linked কোনও কলাম বা বর্তমান ব্যবহারকারীর সেই অবজেক্টে অনুমতি নেই " সুতরাং আপনার একটি লিঙ্কযুক্ত সার্ভার সেট করা দরকার ...
ফেরদেন

10
আপনার কোনও লিঙ্কযুক্ত সার্ভারের দরকার নেই, তবে আপনাকে সংযোগের স্ট্রিংটি সঠিকভাবে পাওয়া দরকার ... এবং এছাড়াও, ডাটাবেসের নাম এবং এসপির মালিক সহ সঞ্চিত প্রক্রিয়াটির পুরো পথ নির্দিষ্ট করে।
মার্টডাব্লু

18
eeeeew! একই সার্ভার রেফারেন্স? কদর্য। ম্যানুয়ালি টেম্প টেবিলটি তৈরি করার চেয়ে হ্যাকের আরও কিছু
টিম অবেল

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

623

আপনি যদি অস্থায়ী টেবিলটি প্রথম ঘোষণা না করে এটি করতে চান তবে আপনি কোনও সঞ্চিত প্রক্রিয়া না করে একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন তৈরির চেষ্টা করতে পারেন এবং সেই ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটিকে একটি সারণী ফিরিয়ে আনতে পারেন। পর্যায়ক্রমে, আপনি যদি সঞ্চিত প্রক্রিয়াটি ব্যবহার করতে চান তবে এই জাতীয় কিছু চেষ্টা করুন:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

170
আমি মনে করি বিন্দুটি স্পষ্টভাবে ঘোষণা না করেই স্কিমা তৈরি করা হয়েছিল।
ক্রেগ

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

11
এটি কাজ করবে তবে আপনি যদি কখনও স্পেগেটেরকর্ডস সঞ্চিত পদ্ধতিতে অতিরিক্ত কলাম যুক্ত করেন তবে এটি ফুরিয়ে যাবে।
ব্র্যাডি হল্ট

15
আপনি প্রতি কল স্ট্যাকের জন্য কেবল একটি INSERT INCO EXEC পান। স্পিগেটরেকর্ডস এবং এটির কলকারী কোনও অন্যরকম এই কৌশলটি তাদের নিজস্ব কোডে ব্যবহার করতে পারে না। এটি SpGetRecord এর রক্ষণাবেক্ষণকারীদের অবাক করে দিতে পারে।
ম্যাট স্টিফেনসন

33
এটি মোটেই প্রশ্নের উত্তর দেয় না এবং আমি দেখতে পাচ্ছি না কেন এটি এতটা উপরে উঠে গেছে? ওপি স্পষ্টভাবে "[টেম্প টেবিল] সংজ্ঞায়িত না করে" বলেছিল এবং আপনার প্রথম লাইনে একটি তৈরি টেম্প টেবিল স্টেটমেন্ট রয়েছে।
নিকজি

296

এসকিউএল সার্ভার 2005-এ আপনি INSERT INTO ... EXECএকটি সারণীতে সঞ্চিত পদ্ধতির ফলাফল সন্নিবেশ করতে ব্যবহার করতে পারেন । থেকে দুটিই MSDN এর INSERTডকুমেন্টেশন (SQL সার্ভার 2000 জন্য, আসলে):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

122
এর জন্য লেখক_সেলগুলি সামনের দিকে সংজ্ঞায়িত করা দরকার। আমি এড়াতে চেষ্টা করছি। ধন্যবাদ।
ফেরদেন

5
আমি অনেক ভেবে দেখলাম. ফ্লাইতে টিএমপি টেবিলগুলিতে usefulোকানো এত দরকারী, তবে যদি আপনার কোনও সঞ্চিত প্রোক থেকে ডেটাসেট কাঠামোটি ফিরে আসে তা জানতে প্রয়োজন। আপনার সহযোগিতার জন্য ধন্যবাদ.
ফেরদেন

3
এখানে একটি ভাল নিবন্ধ আছে msdn.microsoft.com/en-us/library/aa175921.aspx
রিচ অ্যান্ড্রুজ

4
একই স্কিমা ব্যবহার করতে, আপনাকে একটি কপি নিম্নরূপ করতে পারেন: realTable (থেকে tempTable মধ্যে নির্বাচন শীর্ষ 0 * stackoverflow.com/a/9206463/73794 )
এমনকি Mien,

@ এভেনমেন আমি আপনার মন্তব্যটি দেখে ক্ষণে ক্ষণে উত্তেজিত হয়ে উঠলাম ... তবে দুঃখের বিষয়টি কেবল তখনই কার্যকর হয় যদি আপনার
প্রক্টের ফলাফলগুলি

193

এটি আপনার প্রশ্নের সামান্য পরিবর্তিত সংস্করণের উত্তর। আপনি যদি কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশনের জন্য সঞ্চিত প্রক্রিয়াটির ব্যবহারটি ত্যাগ করতে পারেন তবে আপনি একটি ইনলাইন টেবিল-মূল্যবান ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটি ব্যবহার করতে পারেন। এটি মূলত একটি সঞ্চিত পদ্ধতি (প্যারামিটারগুলি নেবে) যা ফলস্বরূপ সেট হিসাবে কোনও টেবিল ফেরত দেয়; এবং অতএব একটি INTO বিবৃতি সহ সুন্দরভাবে স্থাপন করবে।

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

সুতরাং উদাহরণস্বরূপ, নির্দিষ্ট অঞ্চলের গ্রাহকদের তালিকা পাওয়ার জন্য আপনার কাছে একটি ইনলাইন টেবিল-মূল্যযুক্ত ব্যবহারকারী-সংজ্ঞায়িত ফাংশন রয়েছে:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

তারপরে আপনার ফলাফলগুলি কী পেতে আপনি এই ফাংশনটিতে কল করতে পারেন:

SELECT * FROM CustomersbyRegion(1)

অথবা একটি নির্বাচন করুন:

SELECT * INTO CustList FROM CustomersbyRegion(1)

আপনার যদি এখনও একটি সঞ্চিত প্রক্রিয়া প্রয়োজন হয়, তবে ফাংশনটি এমনভাবে মোড়ানো করুন:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

আমি মনে করি কাঙ্ক্ষিত ফলাফল পাওয়ার জন্য এটি সবচেয়ে 'হ্যাক-কম' পদ্ধতি। এটি বিদ্যমান বৈশিষ্ট্যগুলি ব্যবহার করে কারণ এগুলি অতিরিক্ত জটিলতা ছাড়াই ব্যবহার করার উদ্দেশ্যে ছিল। সঞ্চিত পদ্ধতিতে ইনলাইন টেবিল-মূল্যবান ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটি বাসা বেঁধে, আপনি দুটি উপায়ে কার্যকারিতা অ্যাক্সেস করতে পারেন। প্লাস! আসল এসকিউএল কোডের জন্য আপনার কেবলমাত্র একটি রক্ষণাবেক্ষণ রয়েছে।

ওপেনরোউসেটের ব্যবহারের পরামর্শ দেওয়া হয়েছে, তবে এটি ওপেনরোউসেট ফাংশনটি (বুকস অনলাইন থেকে) ব্যবহার করার উদ্দেশ্যে করা হয়েছিল:

OLE DB ডেটা উত্স থেকে দূরবর্তী ডেটা অ্যাক্সেস করার জন্য প্রয়োজনীয় সমস্ত সংযোগের তথ্য অন্তর্ভুক্ত করে। এই পদ্ধতিটি কোনও লিঙ্কযুক্ত সার্ভারে টেবিলগুলি অ্যাক্সেস করার বিকল্প এবং ওএলই ডিবি ব্যবহার করে দূরবর্তী ডেটা সংযোগ স্থাপন এবং অ্যাক্সেস করার এককালীন, অ্যাডহক পদ্ধতি। OLE DB ডেটা উত্সগুলিতে আরও ঘন ঘন রেফারেন্সের জন্য, পরিবর্তে লিঙ্কযুক্ত সার্ভারগুলি ব্যবহার করুন।

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


4
+1 একটি সারণী-মূল্যবান ফাংশন একটি উপযুক্ত সমাধান। আমাদের ছোটখাটো ত্রুটিগুলি লক্ষ্য করা উচিত: টেবিলের মূল্যবান ফাংশন একটি অতিরিক্ত ডেটাবেস অবজেক্ট এবং এতে বিশেষাধিকার দেওয়ার প্রয়োজন হতে পারে।
spencer7593

2
সমাধান ভালোবাসি। একটি ছোটখাটো ছদ্মবেশ যা আমি আঘাত করি, তা হ'ল আমার টেবিলের শৃঙ্খলাবদ্ধ পদ্ধতিতে এটি যেখানে থাকতে পারে তার অর্ডার করতে পারে। ওহ ভাল, আমি এটি বাছাই করব
mrwaim

5
আরও একটি
ছিনতাই

7
আসল প্রশ্নটি হল আমরা কীভাবে একটি টেম্প টেবিল ডাব্লু / এসপি এর ফলাফল তৈরি করব। এটি একটি ভাল প্যাটার্ন, তবে এই প্রশ্নের সমাধান করতে পারে না
গ্রেগ

16
গ্রেগ, আমার উত্তরের প্রথম লাইনে বলা হয়েছে "এটি আপনার প্রশ্নের সামান্য পরিবর্তিত সংস্করণের একটি উত্তর" " আপনার মন্তব্য অপ্রয়োজনীয়।
খ্রিস্টান লরিস 28:53

131
EXEC sp_serveroption 'YOURSERVERNAME', 'DATA ACCESS', TRUE

SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC db.schema.sproc 1')

2
।, লাইন 1 অবৈধ অবজেক্ট নাম 'tmpBusLine' (এটা সংজ্ঞায়িত হয় সামনে না সম্ভবত হিসাবে) একটি "বার্তা 208, লেভেল 16, রাজ্য 1 পান
Ferdeen

1
@ ফার্ডস: দুঃখিত, আপনার অনুরোধটি প্রথমে বুঝতে পারিনি। অন্য একটি সমাধান সহ আপডেট হয়েছে।
কাসনসুই

26
দুর্দান্ত সমাধান। একটি সতর্কতামূলক, আপনাকে আপনার সার্ভারে 'ডেটা অ্যাক্সেস' সক্ষম করতে হবে: এক্সইসিএস sp_serveroption 'TheServerName', 'ডেটা অ্যাক্সেস', সত্য
jcollum

8
আপনাকে সার্ভারে দূরবর্তী অ্যাক্সেসের অনুমতিও দিতে হবে। এটিতে সুরক্ষা ব্যবস্থা রয়েছে।
ব্র্যাভিনিউমথ

7
লক্ষ্য সঞ্চিত পদ্ধতিটি টেম্প টেবিল ব্যবহার করে এটি কাজ করবে না
সাল

125

সবচেয়ে সহজ সমাধান:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

আপনি যদি স্কিমাটি জানেন না তবে আপনি নিম্নলিখিতগুলি করতে পারেন। দয়া করে নোট করুন যে এই পদ্ধতিতে গুরুতর সুরক্ষা ঝুঁকি রয়েছে।

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

যদি আমি ফিরতি রেজাল্টসেটের কলামটি জানি না তবে ??? মানে কলাম আলাদা হতে পারে। তাহলে কীভাবে ফলাফলটি টেম্প টেবিলের মধ্যে sertোকানো যায় ???
শেখর শীট

আপনি বিকল্পগুলি ব্যবহার করতে পারেন তবে এটি সুরক্ষা ত্রুটিগুলির সাথে আসে বলে এটি সুপারিশ করা হয় না।
Tigerjz32

1
"যদি আমি ফিরে আসা রেজসেটটির কলামটি জানি না তবে" তবে আপনি এটি আপনার যুক্তিতে ব্যবহার করতে পারবেন না। আপনি কীভাবে ডেটা ব্যবহার করবেন তা যদি আপনি না জানেন তবে এটি কী?
অ্যাড্রিয়ান দাভেল

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

1
@ নুরেটিন কখনও কখনও আপনি জানেন না যে সঞ্চিত পদ্ধতিটি কী ফিরে আসবে। এক্ষেত্রে কী হয়? আপনি কীভাবে একটি টেম্প টেবিল তৈরি করতে পারেন (যখন আপনি জানেন না যে সঞ্চিত পদ্ধতিটি কী ফিরে আসবে) এবং এটি একটি সঞ্চিত পদ্ধতি থেকে inোকাতে পারে?
Tigerjz32

106

যখন সঞ্চিত পদ্ধতিটি প্রচুর কলাম দেয় এবং আপনি ফলটি ধরে রাখার জন্য অস্থায়ী টেবিলটি ম্যানুয়ালি "তৈরি" করতে চান না, তখন আমি খুঁজে পেলাম সবচেয়ে সহজ উপায় হ'ল সঞ্চিত পদ্ধতিতে গিয়ে একটি "মধ্যে" ধারা যুক্ত করা সর্বশেষ নির্বাচনী বিবৃতিটি নির্বাচন করুন এবং যেখানে ক্লজটিতে 1 = 0 যুক্ত করুন।

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


9
+1, দুর্দান্ত পরামর্শ। আপনি এমনকি @ টেবিলক্রিয়েট নামক স্প্রোকের সাথে একটি দ্রুত alচ্ছিক পরিবর্তনশীল যোগ করতে পারেন বা অনুরূপ কিছু যা উপরে যখন পদক্ষেপগুলি শূন্য হয় না তখন। একবার সেট আপ হয়ে গেলে স্প্রোক পরিবর্তনের প্রয়োজন হয় না।
আয়ান রোকে

1
@ ডটজয় আপনি SELECT INTOটেম্প টেবিলটি তৈরি করেন এবং টেম্প টেবিল থেকে তৈরি হিসাবে কোনও স্ক্রিপ্ট টেবিল করেন? টেম্প টেবিলগুলি দেখানো হয়েছে tempdbতবে আমি ডান ক্লিক করতে এবং একটি স্ক্রিপ্ট তৈরি করতে অক্ষম। কোন সাহায্য প্রশংসা করা হয়।
ডটনেটডুড

2
@ ডটনেটডুড আপনি স্পষ্টতই select ... into new_tableএকটি আসল টেবিল তৈরি করতে পারেন ।
dotjoe

তারপরে খালি টেবিল স্কিমা থেকে মোটামুটি কলাম সংজ্ঞা গ্রহণ করুন; বৈধ TABLE_NAME দিয়ে শেষে '...' প্রতিস্থাপন করুন:declare @s varchar(max)='';select @s=@s+','+COLUMN_NAME+' '+DATA_TYPE+isnull('('+case CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(CHARACTER_MAXIMUM_LENGTH as varchar(10))end+')','')from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='...';select @s
ব্যবহারকারীর 232330 30

এটিই সেরা সমাধান!
লুকাস 925

66
declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp  Exec sp_helpfile;
select * from @temp;

3
প্রথমে টেম্প টেবিলটি সংজ্ঞায়িত করে সন্নিবেশ করে ওপি আসল প্রশ্নটির সমাধান করে না।
t.durden

48

আপনার সঞ্চিত পদ্ধতিটি কি কেবল ডেটা পুনরুদ্ধার করে বা খুব সংশোধন করে? যদি এটি কেবল পুনরুদ্ধারের জন্য ব্যবহার করা হয় তবে আপনি সঞ্চিত পদ্ধতিটিকে কোনও ফাংশনে রূপান্তর করতে পারেন এবং সাধারণ টেবিল এক্সপ্রেশন (সিটিই) ব্যবহার না করে এটি নীচে ঘোষণা করতে পারেন:

with temp as (
    select * from dbo.fnFunctionName(10, 20)
)
select col1, col2 from temp

তবে সিটিই থেকে যা কিছু পুনরুদ্ধার করা দরকার তা কেবলমাত্র একটি বিবৃতিতে ব্যবহার করা উচিত। আপনি with temp as ...এসকিউএল কয়েক লাইন পরে একটি করতে এবং এটি ব্যবহার করার চেষ্টা করতে পারবেন না । আরও জটিল প্রশ্নের জন্য আপনার এক বিবৃতিতে একাধিক সিটিই থাকতে পারে।

উদাহরণ স্বরূপ,

with temp1020 as (
    select id from dbo.fnFunctionName(10, 20)
),
temp2030 as (
    select id from dbo.fnFunctionName(20, 30)
)
select * from temp1020 
where id not in (select id from temp2030)

1
এগুলি অস্থায়ী টেবিল নয়, সিটিই। টেকনেট.মাইক্রোসফট.ইন- ইউএস
লিবারিয়ান

5
ধন্যবাদ @ ইউসার ... আমি বিশ্বাস করি যে আমি জানতাম না যে তাদের তখনই সিটিই বলা হয়েছিল :)
তাই ইউজার

48

যদি আপনার সঞ্চিত প্রকল্পের ফলাফলের টেবিলটি হাতে হাতে "টেবিল তৈরি করুন" টাইপ করতে খুব জটিল হয় এবং আপনি বিকল্প বা অপেনরোগ ব্যবহার করতে না পারেন তবে আপনার জন্য কলাম এবং ডেটা ধরণের তালিকা তৈরি করতে আপনি sp_help ব্যবহার করতে পারেন। আপনার কলামগুলির তালিকা একবার হয়ে গেলে এটি আপনার প্রয়োজন অনুসারে এটি ফর্ম্যাট করার বিষয়।

পদক্ষেপ 1: আউটপুট ক্যোয়ারিতে "# টেম্পে" যুক্ত করুন (উদাহরণস্বরূপ "[...] থেকে # টেম্পে [...]" নির্বাচন করুন)।

সবচেয়ে সহজ উপায় হ'ল সরাসরি প্রোকে আউটপুট ক্যোয়ারী সম্পাদনা করা। আপনি যদি সঞ্চিত প্রকল্পটি পরিবর্তন করতে না পারেন তবে আপনি বিষয়বস্তুগুলিকে একটি নতুন ক্যোয়ারী উইন্ডোতে অনুলিপি করতে পারেন এবং সেখানে ক্যোয়ারীটি পরিবর্তন করতে পারেন।

পদক্ষেপ 2: টেম্প টেবিলের উপর sp_help চালান। (যেমন "এক্সিকিউট টেম্পডিবি..স্প_হেল্প # টেম্প")

টেম্প টেবিলটি তৈরি করার পরে, ভারচার ক্ষেত্রের আকার সহ কলাম এবং ডেটা ধরণের তালিকা পেতে টেম্প টেবিলের উপর sp_help চালান।

পদক্ষেপ 3: একটি তৈরি টেবিলের বিবৃতিতে ডেটা কলাম এবং প্রকারগুলি অনুলিপি করুন

আমার কাছে একটি এক্সেল শীট রয়েছে যা আমি sp_help এর আউটপুটটিকে "তৈরি টেবিল" বিবৃতিতে ফর্ম্যাট করতে ব্যবহার করি। আপনার অভিনব কিছু দরকার নেই, কেবল আপনার এসকিউএল সম্পাদকটিতে অনুলিপি করুন এবং আটকান। "টেবিল তৈরি করুন #x [...]" বা "ডেক্সট @x টেবিল [...]" তৈরি করতে কলামের নাম, আকার এবং প্রকারগুলি ব্যবহার করুন যা আপনি সঞ্চিত পদ্ধতির ফলাফলগুলি সন্নিবেশ করতে ব্যবহার করতে পারেন।

পদক্ষেপ 4: নতুন তৈরি করা টেবিলটি .োকান

এখন আপনার কাছে একটি প্রশ্ন থাকবে যা এই থ্রেডে বর্ণিত অন্যান্য সমাধানগুলির মতো।

DECLARE @t TABLE 
(
   --these columns were copied from sp_help
   COL1 INT,
   COL2 INT   
)

INSERT INTO @t 
Exec spMyProc 

এই কৌশলটি কোনও টেম্প টেবিল ( #temp) কে একটি টেবিল ভেরিয়েবল ( @temp) রূপান্তর করতেও ব্যবহার করা যেতে পারে । যদিও এটি কেবল create tableবিবৃতিটি নিজে লেখার চেয়ে আরও বেশি পদক্ষেপ হতে পারে , এটি ম্যানুয়াল ত্রুটি যেমন বড় প্রক্রিয়াগুলিতে টাইপস এবং ডেটা টাইপ মেলবন্ধগুলি রোধ করে। টাইপো ডিবাগ করতে প্রথমে কোয়েরিটি লেখার চেয়ে বেশি সময় নিতে পারে।


36

যদি ওপেনরোসইটি আপনাকে সমস্যা সৃষ্টি করে, তবে ২০১২ সাল থেকে অন্য উপায় আছে; এখানে উল্লিখিত হিসাবে sys.dm_exec_describe_first_result_set_for_object ব্যবহার করুন: কলামের নাম এবং সঞ্চিত পদ্ধতির প্রকারগুলি পুনরুদ্ধার করবেন?

প্রথমে অস্থায়ী টেবিলের জন্য এসকিউএল তৈরি করতে এই সঞ্চিত পদ্ধতিটি তৈরি করুন:

CREATE PROCEDURE dbo.usp_GetStoredProcTableDefinition(
    @ProcedureName  nvarchar(128),
    @TableName      nvarchar(128),
    @SQL            nvarchar(max) OUTPUT
)
AS
SET @SQL = 'CREATE TABLE ' + @tableName + ' ('

SELECT @SQL = @SQL + '['+name +'] '+ system_type_name +''  + ','
        FROM sys.dm_exec_describe_first_result_set_for_object
        (
          OBJECT_ID(@ProcedureName), 
          NULL
        );

--Remove trailing comma
SET @SQL = SUBSTRING(@SQL,0,LEN(@SQL))    
SET @SQL =  @SQL +')'

পদ্ধতিটি ব্যবহার করতে, নিম্নলিখিত পদ্ধতিতে এটিকে কল করুন:

DECLARE     @SQL    NVARCHAR(MAX)

exec dbo.usp_GetStoredProcTableDefinition
    @ProcedureName='dbo.usp_YourProcedure',
    @TableName='##YourGlobalTempTable',@SQL = @SQL OUTPUT

INSERT INTO ##YourGlobalTempTable
EXEC    [dbo].usp_YourProcedure

select * from ##YourGlobalTempTable

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


4
আপনি টেবিলটি তৈরি করতে ভুলে গেছেন @SQL
ট্রাইপড

32

কাসনসুই আমাকে সেখানে বেশিরভাগ পথে রেখেছিলেন তবে একটি জিনিস অনুপস্থিত:

**** আমার সঞ্চিত পদ্ধতিতে প্যারামিটার ব্যবহার করা দরকার * ****

এবং খোলামেলা এটি হতে দেয় না:

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

হ্যাঁ, আপনি বগুশ ভেরিয়েবলগুলির সাহায্যে OPENQUERY বিবৃতিটি ব্যবহার করে সঞ্চিত পদ্ধতি থেকে ফিরে সারণী সংজ্ঞাটি গতিশীলভাবে তৈরি করতে পারেন (যতক্ষণ না কোনও ফলাফল সেট নেই) একই ক্ষেত্রের সংখ্যা এবং একই সাথে ভাল ডেটা সহ ডেটাসেট হিসাবে একই অবস্থানে থাকে)।

একবার টেবিলটি তৈরি হয়ে গেলে আপনি সারা দিন অস্থায়ী টেবিলের মধ্যে এক্সিকিউট সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন।


এবং নোট করতে (উপরে উল্লিখিত হিসাবে) আপনাকে অবশ্যই ডেটা অ্যাক্সেস সক্ষম করতে হবে,

EXEC sp_serveroption 'MYSERVERNAME', 'DATA ACCESS', TRUE

কোড:

declare @locCompanyId varchar(8)
declare @locDateOne datetime
declare @locDateTwo datetime

set @locDateOne = '2/11/2010'
set @locDateTwo = getdate()

--Build temporary table (based on bogus variable values)
--because we just want the table definition and
--since openquery does not allow variable definitions...
--I am going to use bogus variables to get the table defintion.

select * into #tempCoAttendanceRpt20100211
FROM OPENQUERY(DBASESERVER,
  'EXEC DATABASE.dbo.Proc_MyStoredProc 1,"2/1/2010","2/15/2010 3:00 pm"')

set @locCompanyId = '7753231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

set @locCompanyId = '9872231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

select * from #tempCoAttendanceRpt20100211
drop table #tempCoAttendanceRpt20100211

মূলত যে তথ্য সরবরাহ করা হয়েছিল তার জন্য ধন্যবাদ ... হ্যাঁ, অবশেষে অন্য কোনও সঞ্চিত পদ্ধতি বা ডাটাবেস থেকে ডেটা ব্যবহার করার সময় আমাকে এই সমস্ত বোগাস (কঠোর) সারণী সংজ্ঞা তৈরি করতে হবে না , এবং হ্যাঁ আপনি প্যারামিটারগুলিও ব্যবহার করতে পারেন।

রেফারেন্স ট্যাগগুলি অনুসন্ধান করুন:

  • এসকিউএল 2005 অস্থায়ী সারণিতে প্রক্রিয়া সঞ্চিত

  • সঞ্চিত পদ্ধতি এবং ভেরিয়েবল 2005 সহ ওপেনকোয়ারি

  • ভেরিয়েবলের সাথে মুক্ত

  • টেম্প টেবিলের মধ্যে সঞ্চিত পদ্ধতি চালান

আপডেট: এটি অস্থায়ী টেবিলগুলির সাথে কাজ করবে না তাই আমাকে অস্থায়ী টেবিলটি নিজেই তৈরি করতে হয়েছিল।

বামার নোটিশ : এটি অস্থায়ী টেবিলগুলির সাথে কাজ করবে না , http://www.sommarskog.se/share_data.html#OPENQUERY

তথ্যসূত্র: পরের জিনিসটি LOCALSERVER সংজ্ঞায়িত করা। এটি উদাহরণে কোনও কীওয়ার্ডের মতো দেখতে পারে তবে এটি কেবল একটি নাম। আপনি এটি এইভাবে করেন:

sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                   @provider = 'SQLOLEDB', @datasrc = @@servername

একটি লিঙ্কযুক্ত সার্ভার তৈরি করতে আপনার যে কোনও সার্ভারের পরিবর্তে অনুমতি থাকতে হবে, অথবা কোনও নির্দিষ্ট সার্ভারের ভূমিকা সিসাদমিন বা সেটআপডমিনের সদস্য হতে হবে।

ওপেনকুরি এসকিউএল সার্ভারে একটি নতুন সংযোগ খোলে। এর কিছু জড়িত রয়েছে:

আপনি ওপেনকুয়েরির সাথে যে পদ্ধতিটি কল করেছেন তা বর্তমান সংযোগে তৈরি অস্থায়ী টেবিলগুলি উল্লেখ করতে পারে না।

নতুন সংযোগটির নিজস্ব ডিফল্ট ডাটাবেস রয়েছে (sp_addlinkedserver দিয়ে সংজ্ঞায়িত, ডিফল্ট হ'ল মাস্টার), সুতরাং সমস্ত বস্তুর স্পেসিফিকেশন অবশ্যই একটি ডাটাবেসের নাম অন্তর্ভুক্ত করতে হবে।

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

সংযোগটি নিখরচায় নয়, সুতরাং একটি পারফরম্যান্স পেনাল্টি রয়েছে।


1
আপনি যদি নিজের সার্ভারের নামটি জানেন না, তবে ব্যবহার করুন SELECT @@SERVERNAME। আপনি এটিও ব্যবহার করতে পারেনEXEC sp_serveroption @@SERVERNAME, 'DATA ACCESS', TRUE
কনটাঙ্গো

24

আপনি যদি এসকিউএল 2012 বা তার চেয়ে বেশি ভাগ্যবান হন তবে আপনি এটি ব্যবহার করতে পারেন dm_exec_describe_first_result_set_for_object

আমি স্রেফ গোটকন দ্বারা সরবরাহিত এসকিএল সম্পাদনা করেছি। ধন্যবাদ।

এটি প্রক্রিয়া নামের মতো নামের সাথে একটি গ্লোবাল টেম্প টেবিল তৈরি করে। টেম্প টেবিলটি পরে প্রয়োজনীয় হিসাবে ব্যবহার করা যেতে পারে। পুনরায় কার্যকর করার আগে কেবল এটি ফেলে দিতে ভুলবেন না।

    declare @procname nvarchar(255) = 'myProcedure',
            @sql nvarchar(max) 

    set @sql = 'create table ##' + @procname + ' ('
    begin
            select      @sql = @sql + '[' + r.name + '] ' +  r.system_type_name + ','
            from        sys.procedures AS p
            cross apply sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r
            where       p.name = @procname

            set @sql = substring(@sql,1,len(@sql)-1) + ')'
            execute (@sql)
            execute('insert ##' + @procname + ' exec ' + @procname)
    end

1
অসাধারণ! কেবলমাত্র একটি মন্তব্য: অন্তর্নির্মিত সঞ্চিত পদ্ধতির জন্য আপনি এটি করতে চাইলে sys.all_objectsপরিবর্তে ব্যবহার করুন sys.procedures
জার্ট আর্নল্ড

2
এসপি যদি এর মধ্যে অস্থায়ী টেবিল ব্যবহার করে তবে এটি ব্যর্থ হবে। (তবে এটি আপনার অস্ত্রাগারে
ক্রোক

23

এই সঞ্চিত প্রকল্পটি কাজ করে:

CREATE PROCEDURE [dbo].[ExecIntoTable]
(
    @tableName          NVARCHAR(256),
    @storedProcWithParameters   NVARCHAR(MAX)
)
AS
BEGIN
    DECLARE @driver         VARCHAR(10)
    DECLARE @connectionString   NVARCHAR(600)
    DECLARE @sql            NVARCHAR(MAX)
    DECLARE @rowsetSql      NVARCHAR(MAX)

    SET @driver = '''SQLNCLI'''

    SET @connectionString = 
        '''server=' + 
            CAST(SERVERPROPERTY('ServerName') AS NVARCHAR(256)) + 
            COALESCE('\' + CAST(SERVERPROPERTY('InstanceName') AS NVARCHAR(256)), '') + 
        ';trusted_connection=yes'''

    SET @rowsetSql = '''EXEC ' + REPLACE(@storedProcWithParameters, '''', '''''') + ''''

    SET @sql = '
SELECT
    *
INTO 
    ' + @tableName + ' 
FROM
    OPENROWSET(' + @driver + ',' + @connectionString + ',' + @rowsetSql + ')'

    EXEC (@sql)
END
GO

এটি এর সামান্য পুনর্নির্মাণ: সঞ্চিত প্রক্রিয়া ফলাফলগুলি সারণিতে সন্নিবেশ করান যাতে এটি আসলে কাজ করে।

আপনি যদি এটি অস্থায়ী টেবিলের সাথে কাজ করতে চান তবে আপনাকে একটি ##GLOBALটেবিল ব্যবহার করতে হবে এবং এটি পরে ফেলে দিতে হবে।


17

কোনও অস্থায়ী টেবিলের মধ্যে সঞ্চিত পদ্ধতির প্রথম রেকর্ড সেটটি সন্নিবেশ করানোর জন্য আপনাকে নিম্নলিখিতগুলি জানতে হবে:

  1. কেবলমাত্র সঞ্চিত পদ্ধতির প্রথম সারির সেটটি অস্থায়ী টেবিলের মধ্যে সন্নিবেশ করা যায়
  2. সঞ্চিত পদ্ধতি অবশ্যই গতিশীল টি-এসকিউএল স্টেটমেন্ট কার্যকর করতে পারে না (sp_executesql )
  3. আপনাকে প্রথমে অস্থায়ী টেবিলের কাঠামো সংজ্ঞায়িত করতে হবে

উপরেরটি সীমাবদ্ধতা হিসাবে দেখতে পারে তবে IMHO এটি পুরোপুরি বোঝা যায় - আপনি যদি ব্যবহার করে থাকেন তবে sp_executesqlএকবার আপনি দুটি কলাম এবং একবার দশ বার ফিরে আসতে পারেন এবং যদি আপনার একাধিক ফলাফল সেট থাকে তবে আপনি সেগুলি বেশ কয়েকটি সারণিতেও সন্নিবেশ করতে পারবেন না - আপনি সর্বাধিক সন্নিবেশ করতে পারেন একটি টি-এসকিউএল বিবৃতিতে দুটি সারণীতে (ব্যবহার করে)OUTPUT ক্লজ এবং কোনও ট্রিগার করে)।

সুতরাং, ইস্যুটি মূলত: EXEC ... INTO ...বিবৃতিটি সম্পাদন করার আগে অস্থায়ী টেবিল কাঠামো কীভাবে সংজ্ঞায়িত করা যায় ।

প্রথমটি OBJECT_IDদ্বিতীয়টির সাথে কাজ করে এবং তৃতীয়টি অ্যাড-হক অনুসন্ধানগুলির সাথেও কাজ করে। আপনি এসপির পরিবর্তে ডিএমভি ব্যবহার করতে পছন্দ করেন কারণ আপনি CROSS APPLYএকই সময়ে একাধিক পদ্ধতির জন্য অস্থায়ী টেবিল সংজ্ঞা ব্যবহার করতে এবং তৈরি করতে পারেন ।

SELECT p.name, r.* 
FROM sys.procedures AS p
CROSS APPLY sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r;

এছাড়াও, system_type_nameক্ষেত্রটি মনোযোগ দিন কারণ এটি খুব দরকারী হতে পারে। এটি কলাম সম্পূর্ণ সংজ্ঞা সঞ্চয় করে। উদাহরণ স্বরূপ:

smalldatetime
nvarchar(max)
uniqueidentifier
nvarchar(1000)
real
smalldatetime
decimal(18,2)

এবং আপনি টেবিল সংজ্ঞা তৈরি করতে বেশিরভাগ ক্ষেত্রে সরাসরি এটি ব্যবহার করতে পারেন।

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


দ্রষ্টব্য, যে উপরের বস্তুগুলি কিছু ক্ষেত্রে প্রথম ফলাফল সেট ডেটা সংজ্ঞায়িত করতে ব্যর্থ হয় যেমন ডায়নামিক টি-এসকিউএল বিবৃতি কার্যকর করা হয় বা সঞ্চিত পদ্ধতিতে অস্থায়ী সারণী ব্যবহার করা হয়।


সীমাবদ্ধতার উপর ব্যবহারিক পর্যবেক্ষণ: যদি আপনাকে কোনও এসপির আউটপুট সন্নিবেশ করতে হয় (এটিকে SP_LEVEL_0 বলতে দেয়) অন্য স্প্রে উপরোক্ত পদ্ধতির ব্যবহার করে গতিশীলভাবে তৈরি টেবিলের জন্য (এটিকে SP_LEVEL_1 বলতে পারি), আপনি এই SP_LEVEL_1 এর আউটপুটে একই কৌশল করতে পারবেন না কিছু অন্য টেম্প টেবিল SP_LEVEL_2
নাহাব

17
  1. আমি নিম্নলিখিত স্কিমা এবং ডেটা সহ একটি টেবিল তৈরি করছি।
  2. একটি সঞ্চিত পদ্ধতি তৈরি করুন।
  3. এখন আমি জানি যে আমার পদ্ধতির ফলাফল কী, তাই আমি নিম্নলিখিত কোয়েরিটি সম্পাদন করছি।

    CREATE TABLE [dbo].[tblTestingTree](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ParentId] [int] NULL,
        [IsLeft] [bit] NULL,
        [IsRight] [bit] NULL,
    CONSTRAINT [PK_tblTestingTree] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[tblTestingTree] ON
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (1, NULL, NULL, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (2, 1, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (3, 1, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (4, 2, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (5, 2, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (6, 3, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (7, 3, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (8, 4, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (9, 4, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (10, 5, 1, NULL)
    
    SET IDENTITY_INSERT [dbo].[tblTestingTree] OFF

    মূল্য (10, 5, 1, NULL) সেট পরিচয়পত্রের নম্বর [ডিবিও] [

    create procedure GetDate
    as
    begin
        select Id,ParentId from tblTestingTree
    end
    
    create table tbltemp
    (
        id int,
        ParentId int
    )
    insert into tbltemp
    exec GetDate
    
    select * from tbltemp;

15

যদি ক্যোয়ারিতে প্যারামিটার না থাকে তবে OpenQueryঅন্যটি ব্যবহার করুন OpenRowset

মূল জিনিস হ'ল সঞ্চিত পদ্ধতি অনুসারে স্কিমা তৈরি করা এবং সেই সারণিতে sertোকানো। উদাহরণ:

DECLARE @abc TABLE(
                  RequisitionTypeSourceTypeID INT
                , RequisitionTypeID INT
                , RequisitionSourcingTypeID INT
                , AutoDistOverride INT
                , AllowManagerToWithdrawDistributedReq INT
                , ResumeRequired INT
                , WarnSupplierOnDNRReqSubmission  INT
                , MSPApprovalReqd INT
                , EnableMSPSupplierCounterOffer INT
                , RequireVendorToAcceptOffer INT
                , UseCertification INT
                , UseCompetency INT
                , RequireRequisitionTemplate INT
                , CreatedByID INT
                , CreatedDate DATE
                , ModifiedByID INT
                , ModifiedDate DATE
                , UseCandidateScheduledHours INT
                , WeekEndingDayOfWeekID INT
                , AllowAutoEnroll INT
                )
INSERT INTO @abc
EXEC [dbo].[usp_MySp] 726,3
SELECT * FROM @abc

13

কোড

CREATE TABLE #T1
(
    col1 INT NOT NULL,
    col2 NCHAR(50) NOT NULL,
    col3 TEXT NOT NULL,
    col4 DATETIME NULL,
    col5 NCHAR(50) NULL,
    col6 CHAR(2) NULL,
    col6 NCHAR(100) NULL,
    col7 INT NULL,
    col8 NCHAR(50) NULL,
    col9 DATETIME NULL,
    col10 DATETIME NULL
)

DECLARE @Para1 int
DECLARE @Para2 varchar(32)
DECLARE @Para3 varchar(100)
DECLARE @Para4 varchar(15)
DECLARE @Para5 varchar (12)
DECLARE @Para6 varchar(1)
DECLARE @Para7 varchar(1)


SET @Para1 = 1025
SET @Para2 = N'6as54fsd56f46sd4f65sd'
SET @Para3 = N'XXXX\UserName'
SET @Para4 = N'127.0.0.1'
SET @Para5 = N'XXXXXXX'
SET @Para6 = N'X'
SET @Para7 = N'X'

INSERT INTO #T1
(
    col1,
    col2,
    col3,
    col4,
    col5,
    col6,
    col6,
    col7,
    col8,
    col9,
    col10,
)
EXEC [dbo].[usp_ProcedureName] @Para1, @Para2, @Para3, @Para4, @Para5, @Para6, @Para6

আশা করি এটা কাজে লাগবে. উপযুক্ত হিসাবে যোগ্যতা অর্জন করুন।


11

আমি সঞ্চিত পদ্ধতিতে অ্যারে / ডেটা টেবিলগুলি পাস করার বিষয়টি পেয়েছি যা আপনি কীভাবে আপনার সমস্যার সমাধান করতে পারবেন সে সম্পর্কে আপনাকে আরেকটি ধারণা দিতে পারে।

লিঙ্কটি সঞ্চিত পদ্ধতিতে পাস করার জন্য একটি চিত্র ধরণের প্যারামিটার ব্যবহার করার পরামর্শ দেয় । তারপরে সঞ্চিত পদ্ধতিতে চিত্রটি একটি মূল সারণী ভেরিয়েবলে রূপান্তরিত হয় data

অস্থায়ী টেবিলের সাথে এটি ব্যবহার করার উপায় রয়েছে।


4
এটি আর SQLl2008 সংস্করণে এবং পরে সারণীর মান প্যারামিটারগুলির প্রবর্তনের প্রয়োজন নেই । উপরের লিঙ্কে উল্লিখিত হিসাবে
বন্ডে

10

আমি একই সমস্যার মুখোমুখি হয়েছি এবং পলের পরামর্শ থেকে আমি এটির জন্য এখানে যা করেছি । মূল অংশটি হ'ল NEWID()একাধিক ব্যবহারকারীর একই সময়ে স্টোর পদ্ধতি / স্ক্রিপ্টগুলি চালানো এড়াতে ব্যবহার করা, বৈশ্বিক অস্থায়ী টেবিলের জন্য ব্যথা।

DECLARE @sql varchar(max) = '', 
@tmp_global_table varchar(255) = '##global_tmp_' + CONVERT(varchar(36), NEWID())
SET @sql = @sql + 'select * into [' + @tmp_global_table + '] from YOURTABLE'
EXEC(@sql)

EXEC('SELECT * FROM [' + @tmp_global_table + ']')

9

অন্য পদ্ধতিটি হ'ল একটি প্রকার তৈরি করুন এবং আপনার অবজেক্টটি ফেরত দেওয়ার জন্য পাইপলাইনযুক্ত ব্যবহার করুন। এটি তবে কলামগুলি জানার মধ্যেই সীমাবদ্ধ। তবে এটি করতে সক্ষম হওয়ার সুবিধা রয়েছে:

SELECT * 
FROM TABLE(CAST(f$my_functions('8028767') AS my_tab_type))

এটা কি? এই প্রশ্নটি সম্পর্কে এসকিউএল সার্ভারের সাথে কোনও সম্পর্ক নেই বলে মনে হচ্ছে
মার্টিন স্মিথ

8

এটি একটি সহজ 2 ধাপের প্রক্রিয়া: - একটি অস্থায়ী টেবিল তৈরি করুন - অস্থায়ী সারণীতে sertোকান।

একই সম্পাদন করার কোড:

CREATE TABLE #tempTable (Column1 int, Column2 varchar(max));
INSERT INTO #tempTable 
EXEC [app].[Sproc_name]
@param1 = 1,
@param2 =2;

Downvoted; বিদ্যমান উত্তর (গুলি) এর সাথে খুব মিল।
iokevins

6

আশেপাশে অনুসন্ধানের পরে আমি কোনও স্টোরেজ প্রক্রিয়া ব্যবহার না করে OPENROWSETবা গতিশীলভাবে একটি টেম্প টেবিল তৈরির একটি উপায় খুঁজে পেয়েছিOPENQUERY ফলাফল সংজ্ঞাটির জেনেরিক স্কিমা ব্যবহার বিশেষত যখন আপনি ডাটাবেস প্রশাসক নন।

SQL সার্ভারে একটি বিট-ইন প্রো রয়েছে sp_describe_first_result_setযা আপনাকে কোনও পদ্ধতির ফলাফলসেটের স্কিমা সরবরাহ করতে পারে। আমি এই পদ্ধতির ফলাফল থেকে একটি স্কিমা টেবিল তৈরি করেছি এবং সমস্ত ক্ষেত্রটি ম্যানুয়ালি নূলেলে সেট করেছি।

declare @procname varchar(100) = 'PROCEDURENAME' -- your procedure name
declare @param varchar(max) = '''2019-06-06''' -- your parameters 
declare @execstr nvarchar(max) = N'exec ' + @procname
declare @qry nvarchar(max)

-- Schema table to store the result from sp_describe_first_result_set.
create table #d
(is_hidden  bit  NULL, column_ordinal   int  NULL, name sysname NULL, is_nullable   bit  NULL, system_type_id   int  NULL, system_type_name nvarchar(256) NULL,
max_length  smallint  NULL, precision   tinyint  NULL,  scale   tinyint  NULL,  collation_name  sysname NULL, user_type_id  int NULL, user_type_database    sysname NULL,
user_type_schema    sysname NULL,user_type_name sysname NULL,assembly_qualified_type_name   nvarchar(4000),xml_collection_id    int NULL,xml_collection_database    sysname NULL,
xml_collection_schema   sysname NULL,xml_collection_name    sysname NULL,is_xml_document    bit  NULL,is_case_sensitive bit  NULL,is_fixed_length_clr_type  bit  NULL,
source_server   sysname NULL,source_database    sysname NULL,source_schema  sysname NULL,source_table   sysname NULL,source_column  sysname NULL,is_identity_column bit NULL,
is_part_of_unique_key   bit NULL,is_updateable  bit NULL,is_computed_column bit NULL,is_sparse_column_set   bit NULL,ordinal_in_order_by_list   smallint NULL,
order_by_list_length    smallint NULL,order_by_is_descending    smallint NULL,tds_type_id   int  NULL,tds_length    int  NULL,tds_collation_id  int NULL,
tds_collation_sort_id   tinyint NULL)


-- Get result set definition of your procedure
insert into #d
EXEC sp_describe_first_result_set @exestr, NULL, 0

-- Create a query to generate and populate a global temp table from above results
select 
@qry = 'Create table ##t(' +
stuff(  
    (select ',' + name + ' '+ system_type_name + ' NULL'
    from #d d For XML Path, TYPE)
    .value(N'.[1]', N'nvarchar(max)')
, 1,1,'')
+ ')

insert into ##t 
Exec '+@procname+' ' + @param

Exec sp_executesql @qry

-- Use below global temp table to query the data as you may
select * from ##t

-- **WARNING** Don't forget to drop the global temp table ##t.
--drop table ##t
drop table #d 

এসকিউএল সার্ভার সংস্করণে বিকাশিত এবং পরীক্ষিত - মাইক্রোসফ্ট এসকিউএল সার্ভার 2016 (আরটিএম) - 13.0.1601.5 (বিল্ড 17134 :)

আপনি যে এসকিউএল সার্ভার সংস্করণ ব্যবহার করছেন সেটির জন্য আপনি স্কিমাটি টুইঙ্ক করতে পারেন (যদি প্রয়োজন হয়)।


4

আপনি যদি প্যারামিটারগুলি উত্তীর্ণ হয়ে থাকেন এবং যদি আপনার কাছে sp_configure তৈরি করার অ্যাক্সেস না থাকে তবে এই পরামিতিগুলির সাথে সঞ্চিত পদ্ধতিটি সম্পাদনা করুন এবং এটি একটি ## গ্লোবাল সারণীতে সংরক্ষণ করা যেতে পারে।


3

এটি এসকিউএল সার্ভার 2014+ এ করা যেতে পারে তবে সরবরাহিত সঞ্চিত পদ্ধতিটি কেবল একটি টেবিল ফেরত দেয়। যদি কেউ একাধিক টেবিলের জন্য এটি করার কোনও উপায় খুঁজে পায় তবে আমি এটি সম্পর্কে জানতে আগ্রহী।

DECLARE @storedProcname NVARCHAR(MAX) = ''
SET @storedProcname = 'myStoredProc'

DECLARE @strSQL AS VARCHAR(MAX) = 'CREATE TABLE myTableName '

SELECT @strSQL = @strSQL+STUFF((
SELECT ',' +name+' ' + system_type_name 
FROM sys.dm_exec_describe_first_result_set_for_object (OBJECT_ID(@storedProcname),0)
FOR XML PATH('')
),1,1,'(') + ')'

EXEC (@strSQL)

INSERT INTO myTableName

EXEC ('myStoredProc @param1=1, @param2=2')

SELECT * FROM myTableName

DROP TABLE myTableName

এটি সিস্টেম সারণীগুলি থেকে ফিরে আসা টেবিলের সংজ্ঞা টানতে পারে এবং এটি আপনার জন্য টেম্প টেবিলটি তৈরি করতে ব্যবহার করে। তারপরে আপনি এটি পূর্বে উল্লিখিত হিসাবে সঞ্চিত প্রক্রিয়া থেকে পপুলেট করতে পারেন।

এর বিভিন্ন রূপ রয়েছে যা ডায়নামিক এসকিউএল এর সাথেও কাজ করে।


2

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

এটি কিছুটা বিশৃঙ্খলাযুক্ত হবে তবে এটি এখানে অবদানকারীদের কাছ থেকে bণ গ্রহণের পাশাপাশি ডিবিএ স্ট্যাক এক্সচেঞ্জের পল হোয়াইটের সমাধান সংগ্রহের পদ্ধতি ফলাফল কলামের ধরণের পান । আবার এই পদ্ধতির পুনরাবৃত্তি করার জন্য এবং উদাহরণটি একাধিক ব্যবহারকারীর পরিবেশে প্রক্রিয়াগুলির জন্য ডিজাইন করা হয়নি। এক্ষেত্রে একটি কোড জেনারেশন টেমপ্লেট প্রক্রিয়া দ্বারা রেফারেন্সের জন্য একটি টেম্পল সংজ্ঞা একটি বিশ্বব্যাপী টেম্প টেবিলে স্বল্প সময়ের জন্য সেট করা হচ্ছে।

আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি তাই ক্যাভ্যাট থাকতে পারে যাতে আপনি পল হোয়াইটের উত্তরের এমএসডিএন লিঙ্কে যেতে চাইতে পারেন। এটি এসকিউএল 2012 এবং তার চেয়েও বেশি ক্ষেত্রে প্রযোজ্য।

প্রথমে সঞ্চিত প্রক্রিয়াটি sp_describe_first_result_set ব্যবহার করুন যা ওরাকলের বর্ণনার সাথে সাদৃশ্যপূর্ণ।

এটি প্রথম ফলাফলের প্রথম সারির মূল্যায়ন করবে যাতে আপনার সঞ্চিত পদ্ধতি বা বিবৃতিটি একাধিক কোয়েরি প্রদান করে তবে এটি কেবল প্রথম ফলাফলের বর্ণনা দেবে।

টেম্প টেবিল সংজ্ঞা তৈরি করতে বেছে নেওয়া একটি একক ক্ষেত্র প্রত্যাবর্তনকারী কার্যগুলিকে ভাঙ্গার জন্য আমি একটি সঞ্চিত সংগ্রহ তৈরি করেছি।

CREATE OR ALTER PROCEDURE [dbo].[sp_GetTableDefinitionFromSqlBatch_DescribeFirstResultSet]
(
     @sql NVARCHAR(4000)
    ,@table_name VARCHAR(100)
    ,@TableDefinition NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @TempTableDefinition NVARCHAR(MAX)
    DECLARE @NewLine NVARCHAR(4) = CHAR(13)+CHAR(10)

    DECLARE @ResultDefinition TABLE (  --The View Definition per MSDN
      is_hidden         bit NOT NULL
    , column_ordinal    int NOT NULL
    , [name]            sysname NULL
    , is_nullable       bit NOT NULL
    , system_type_id    int NOT NULL
    , system_type_name  nvarchar(256) NULL
    , max_length        smallint NOT NULL
    , [precision]       tinyint NOT NULL
    , scale             tinyint NOT NULL
    , collation_name    sysname NULL    
    , user_type_id      int NULL
    , user_type_database    sysname NULL    
    , user_type_schema  sysname NULL
    , user_type_name    sysname NULL    
    , assembly_qualified_type_name      nvarchar(4000)  
    , xml_collection_id         int NULL
    , xml_collection_database   sysname NULL    
    , xml_collection_schema     sysname NULL    
    , xml_collection_name       sysname NULL
    , is_xml_document           bit NOT NULL            
    , is_case_sensitive         bit NOT NULL            
    , is_fixed_length_clr_type  bit NOT NULL    
    , source_server             sysname NULL            
    , source_database           sysname NULL
    , source_schema             sysname NULL
    , source_table              sysname NULL
    , source_column             sysname NULL
    , is_identity_column        bit NULL
    , is_part_of_unique_key     bit NULL
    , is_updateable             bit NULL
    , is_computed_column        bit NULL
    , is_sparse_column_set      bit NULL
    , ordinal_in_order_by_list  smallint NULL   
    , order_by_is_descending    smallint NULL   
    , order_by_list_length      smallint NULL
    , tds_type_id               int NOT NULL
    , tds_length                int NOT NULL
    , tds_collation_id          int NULL
    , tds_collation_sort_id     tinyint NULL
    )

    --Insert the description into table variable    
    INSERT @ResultDefinition
    EXEC sp_describe_first_result_set @sql

    --Now Build the string to create the table via union select statement
    ;WITH STMT AS (
        SELECT N'CREATE TABLE ' + @table_name + N' (' AS TextVal
        UNION ALL

        SELECT 
         CONCAT(
                CASE column_ordinal
                    WHEN 1 THEN '     ' ELSE '   , ' END  --Determines if comma should precede
                , QUOTENAME([name]) , '   ', system_type_name  -- Column Name and SQL TYPE
                ,CASE is_nullable 
                    WHEN 0 THEN '   NOT NULL' ELSE '   NULL' END --NULLABLE CONSTRAINT          
               ) AS TextVal
        FROM @ResultDefinition WHERE is_hidden = 0  -- May not be needed
        UNION ALL

        SELECT N');' + @NewLine
    ) 

    --Now Combine the rows to a single String
    SELECT @TempTableDefinition = COALESCE (@TempTableDefinition + @NewLine + TextVal, TextVal) FROM STMT

    SELECT @TableDefinition = @TempTableDefinition
END

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

DECLARE @sql NVARCHAR(4000) = N'SELECT @@SERVERNAME as ServerName, GETDATE() AS Today;'
DECLARE @GlobalTempTable VARCHAR(100) = N'##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable'

--@sql can be a stored procedure name like dbo.foo without parameters

DECLARE @TableDef NVARCHAR(MAX)

DROP TABLE IF EXISTS #MyTempTable
DROP TABLE IF EXISTS ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable

EXEC [dbo].[sp_GetTableDefinitionFromSqlBatch_DescribeFirstResultSet] 
    @sql, @GlobalTempTable, @TableDef OUTPUT

--Creates the global table ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
EXEC sp_executesql @TableDef 

--Now Call the stored procedure, SQL Statement with Params etc.
INSERT ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable
    EXEC sp_executesql @sql 

--Select the results into your undefined Temp Table from the Global Table
SELECT * 
INTO #MyTempTable
FROM ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable

SELECT * FROM #MyTempTable

DROP TABLE IF EXISTS #MyTempTable
DROP TABLE IF EXISTS ##FE264BF5_9C32_438F_8462_8A5DC8DEE49E_MyTempTable

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


1

ঠিক আছে, আপনাকে একটি টেম্প টেবিল তৈরি করতে হবে, তবে এটির সঠিক স্কিমা থাকতে হবে না .... আমি একটি সঞ্চিত পদ্ধতি তৈরি করেছি যা একটি বিদ্যমান টেম্প টেবিলটি সংশোধন করে যাতে এটিতে সঠিক ডেটা সহ প্রয়োজনীয় কলাম থাকে প্রকার ও ক্রম (সমস্ত বিদ্যমান কলাম কমানো, নতুন কলাম যুক্ত করা):

GO
create procedure #TempTableForSP(@tableId int, @procedureId int)  
as   
begin  
    declare @tableName varchar(max) =  (select name  
                                        from tempdb.sys.tables 
                                        where object_id = @tableId
                                        );    
    declare @tsql nvarchar(max);    
    declare @tempId nvarchar(max) = newid();      
    set @tsql = '    
    declare @drop nvarchar(max) = (select  ''alter table tempdb.dbo.' + @tableName 
            +  ' drop column ''  + quotename(c.name) + '';''+ char(10)  
                                   from tempdb.sys.columns c   
                                   where c.object_id =  ' + 
                                         cast(@tableId as varchar(max)) + '  
                                   for xml path('''')  
                                  )    
    alter table tempdb.dbo.' + @tableName + ' add ' + QUOTENAME(@tempId) + ' int;
    exec sp_executeSQL @drop;    
    declare @add nvarchar(max) = (    
                                select ''alter table ' + @tableName 
                                      + ' add '' + name 
                                      + '' '' + system_type_name 
                           + case when d.is_nullable=1 then '' null '' else '''' end 
                                      + char(10)   
                              from sys.dm_exec_describe_first_result_set_for_object(' 
                               + cast(@procedureId as varchar(max)) + ', 0) d  
                                order by column_ordinal  
                                for xml path(''''))    

    execute sp_executeSQL  @add;    
    alter table '  + @tableName + ' drop column ' + quotename(@tempId) + '  ';      
    execute sp_executeSQL @tsql;  
end         
GO

create table #exampleTable (pk int);

declare @tableId int = object_Id('tempdb..#exampleTable')
declare @procedureId int = object_id('examplestoredProcedure')

exec #TempTableForSP @tableId, @procedureId;

insert into #exampleTable
exec examplestoredProcedure

মনে রাখবেন যে sys.dm_exec_describe_first_result_set_for_object সঞ্চিত পদ্ধতির ফলাফল নির্ধারণ করতে না পারলে (উদাহরণস্বরূপ যদি এটি একটি টেম্প টেবিল ব্যবহার করে)।


0

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

DECLARE @COMMA_SEPARATED_KEYS varchar(MAX);
DROP TABLE IF EXISTS KV;
CREATE TABLE KV (id_person int, mykey varchar(30), myvalue int);
INSERT INTO KV VALUES
(1, 'age', 16),
(1, 'weight', 63),
(1, 'height', 175),
(2, 'age', 26),
(2, 'weight', 83),
(2, 'height', 185);
WITH cte(mykey) AS (
    SELECT DISTINCT mykey FROM KV
) 
SELECT @COMMA_SEPARATED_KEYS=STRING_AGG(mykey,',') FROM cte;
SELECT @COMMA_SEPARATED_KEYS AS keys;

এখানে চিত্র বর্ণনা লিখুন

DECLARE @ExecuteExpression varchar(MAX);

DROP TABLE IF EXISTS #Pivoted;

SET @ExecuteExpression = N'
SELECT * 
INTO #Pivoted
FROM
(
    SELECT
        mykey,
        myvalue,
        id_person
    FROM KV
) AS t
PIVOT(
    MAX(t.myvalue) 
    FOR mykey IN (COMMA_SEPARATED_KEYS)
) AS pivot_table;
';

SET @ExecuteExpression = REPLACE(@ExecuteExpression, 'COMMA_SEPARATED_KEYS', @COMMA_SEPARATED_KEYS);

EXEC(@ExecuteExpression);

SELECT * FROM #Pivoted;

Msg 208, স্তর 16, রাজ্য 0 অবৈধ অবজেক্টের নাম '#Pivated'। এর কারণ হল # প্রাইভেটেডটি ডায়নামিক এসকিউএল সংযোগের মালিকানাধীন। তাই শেষ নির্দেশ

SELECT * FROM #Pivoted

ব্যর্থ।

এই ইস্যুটির মুখোমুখি না হওয়ার একটি উপায় হ'ল ডায়ামিক ক্যোয়ারির ভিতরে থেকেই #Pivated- এ সমস্ত তথ্য উল্লেখ করা হয়েছে তা নিশ্চিত করা:

DECLARE @COMMA_SEPARATED_KEYS varchar(MAX);
DROP TABLE IF EXISTS KV;
CREATE TABLE KV (id_person int, mykey varchar(30), myvalue int);
INSERT INTO KV VALUES
(1, 'age', 16),
(1, 'weight', 63),
(1, 'height', 175),
(2, 'age', 26),
(2, 'weight', 83),
(2, 'height', 185);
WITH cte(mykey) AS (
    SELECT DISTINCT mykey FROM KV
) 
SELECT @COMMA_SEPARATED_KEYS=STRING_AGG(mykey,',') FROM cte;
SELECT @COMMA_SEPARATED_KEYS AS keys;


DECLARE @ExecuteExpression varchar(MAX);

DROP TABLE IF EXISTS #Pivoted;

SET @ExecuteExpression = N'
SELECT * 
INTO #Pivoted
FROM
(
    SELECT
        mykey,
        myvalue,
        id_person
    FROM KV
) AS t
PIVOT(
    MAX(t.myvalue) 
    FOR mykey IN (COMMA_SEPARATED_KEYS)
) AS pivot_table;
SELECT * FROM #Pivoted;
';

SET @ExecuteExpression = REPLACE(@ExecuteExpression, 'COMMA_SEPARATED_KEYS', @COMMA_SEPARATED_KEYS);

EXEC(@ExecuteExpression);

এখানে চিত্র বর্ণনা লিখুন


-5

আমি নিম্নলিখিত করতে হবে

  1. একটি ইউডিএফ তৈরি করুন (এসপি রূপান্তর করুন) (সারণির মান ইউডিএফ)।

  2. select * into #tmpBusLine from dbo.UDF_getBusinessLineHistory '16 Mar 2009'


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