এসকিউএল সার্ভার - সঞ্চিত পদ্ধতি থেকে নির্বাচন করুন


334

আমার একটি সঞ্চিত পদ্ধতি রয়েছে যা সারিগুলি দেয়:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

আমার আসল পদ্ধতিটি আরও জটিল, এজন্য একটি স্প্রোক প্রয়োজনীয় necessary

এই পদ্ধতিটি কল করে কি আউটপুট নির্বাচন করা সম্ভব?

কিছুটা এইরকম:

SELECT * FROM (EXEC MyProc) AS TEMP

আমি ব্যবহার করতে হবে SELECT TOP X, ROW_NUMBERএবং, একটি অতিরিক্ত WHEREপৃষ্ঠা থেকে আপনাকে দফা আমার ডেটা, এবং আমি না সত্যিই প্যারামিটার হিসেবে এই মান পাস করতে চাই।


আপনি এখানে কী করতে চান তা সম্পর্কে আমি নিশ্চিত নই কারণ আপনি যখন পদ্ধতিটি সম্পাদন করেন, আপনি সারিগুলি ফিরে পেয়ে যাবেন। আপনি যদি একটি নির্বাচনী বিবৃতিতে প্রক্রিয়াটি চালিত করতে চান তবে আপনি এটি কোনও পৃষ্ঠাযুক্ত বস্তুর সাথে বেঁধে রাখতে চান?
রাজ আরও

1
আপনি যদি প্যারামিটার হিসাবে মানগুলি পাস করতে চান না এমন কোনও কারণ আছে? আপনি যেভাবে পরামর্শ দিচ্ছেন এটি করার জন্য এটি কিছুটা অদক্ষ - আপনি আপনার প্রয়োজনের চেয়ে বেশি ডেটা নির্বাচন করছেন এবং তারপরে এটি সমস্ত ব্যবহার করবেন না।
মার্ক বেল

2
এখানে একবার দেখুন: sommarskog.se/share_data.html
পাইওভার

উত্তর:


149

আপনি কোনও পদ্ধতির পরিবর্তে কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন বা একটি ভিউ ব্যবহার করতে পারেন ।

একটি পদ্ধতি একাধিক ফলাফল সেট, প্রতিটি নিজস্ব স্কিমা সহ ফিরে আসতে পারে। এটি কোনও SELECTবিবৃতিতে ব্যবহারের জন্য উপযুক্ত নয় ।


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

তাহলে কী, যদি আমরা বহুগুণিত সঞ্চিত পদ্ধতিতে পরামিতিগুলি প্রেরণ করতে এবং সেগুলিকে এক এক বৃহত সঞ্চিত পদ্ধতিতে একত্রিত করতে পারি? সঞ্চিত পদ্ধতিগুলির মতো প্যারামিটারগুলি দেখতে পারে, নিতে পারে
mrN

3
@ এমআরএন ভিউ প্যারামিটার নেয় না, তবে ইউডিএফগুলি করে।
মেহরদাদ আফশারি

3
হ্যালো, এসপকে কোনও ভিউ বা ফাংশনে রূপান্তর না করেই সত্যিই আমার এটি করা দরকার, এটি কি সম্ভব?
লুইস বেরারিল

2
যদিও আপনার উত্তরটি সত্য বিবৃতি তা প্রশ্নের উত্তর দেয় না .... "সঞ্চিত প্রক্রিয়া থেকে নির্বাচন করুন" যা নিশ্চিত যে এটি আদর্শ নয় তবে এটি যা তা ... @ আমিরের উত্তরটি সঠিক উত্তর। হয় বা প্রশ্নটি পরিবর্তন করা দরকার ... যা আমার কাছে কিছুটা হাস্যকর বলে মনে হচ্ছে।
ইউরোস্কুইরেল

202

আপনি পারেন

  1. সঞ্চিত প্রকল্প থেকে ফলাফল সেট রাখতে একটি সারণী ভেরিয়েবল তৈরি করুন এবং তারপরে
  2. সারণী ভেরিয়েবলের মধ্যে সঞ্চিত প্রোকটির আউটপুট প্রবেশ করান এবং তারপরে
  3. আপনি অন্য কোনও টেবিলের মতো হ'ল টেবিলের পরিবর্তনশীলটি ব্যবহার করুন ...

... বর্গ ...

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...

34
INSERT #Tবা এর সাথে সমস্যাটি INSERT @Tহল যে কোনও INSERT EXECবিবৃতি নেস্ট করা যায় না। যদি ইতিমধ্যে সঞ্চিত পদ্ধতিতে এটি INSERT EXECথাকে তবে এটি কাজ করবে না।
MOHCTP

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

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

76

আপনি হয় একটি সারণী-মূল্যবান ফাংশন চান বা একটি অস্থায়ী টেবিলের মধ্যে আপনার EXEC সন্নিবেশ করুন:

INSERT INTO #tab EXEC MyProc

32
INSERT #Tবা এর সাথে সমস্যাটি INSERT @Tহল যে কোনও INSERT EXECবিবৃতি নেস্ট করা যায় না। যদি ইতিমধ্যে সঞ্চিত পদ্ধতিতে এটি INSERT EXECথাকে তবে এটি কাজ করবে না।
MOHCTP

46

আপনাকে অবশ্যই ওপেনরোসেট এবং অপেনপুরি সম্পর্কে পড়তে হবে

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')

4
কীভাবে গতিশীলভাবে আপনার নিজের নামটি পাবেন? আপনি সর্বদা জানতে হবে আশা করতে পারবেন না। এই প্রতি মঙ্গলবার বিরতি হবে না? সুতরাং আমি যদি বিভিন্ন নামের সাথে 100 টি সার্ভার পেয়ে থাকি ...
ইউরস্কুইরেল

এছাড়াও যদি আমার ডাটাবেস এটির জন্য কনফিগার করা না থাকে?
উড়সকিয়ারিল

4
এটি গতিশীলরূপে পেতে সার্ভারনেমটি চেষ্টা করুন
সিদ্ধার্থ গান্ধী

44

আপনাকে এমন একটি টেবিল প্রকার ঘোষণা করতে হবে যাতে আপনার স্টোর পদ্ধতিটি ফিরে আসার একই সংখ্যক কলামগুলিতে থাকে contains সারণী প্রকারে কলামগুলির ডেটা ধরণের এবং পদ্ধতিগুলি দ্বারা ফিরে আসা কলামগুলি একই হওয়া উচিত

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

তারপরে আপনার সারণী প্রকারে আপনি সুনির্দিষ্টভাবে সংজ্ঞায়িত করেছেন আপনার সঞ্চিত পদ্ধতির ফলাফল সন্নিবেশ করা দরকার

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

শেষ পর্যন্ত কেবল আপনার টেবিলের প্রকার থেকে নির্বাচন করুন

Select * from @MyTableType

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

চমৎকার উত্তর ღ❤ ೋ ღ❤ღ ೋ❤ ღ
নাহিদ

যখন সঞ্চিত পদ্ধতিটি খুব স্বতন্ত্র - এই পদ্ধতিটি কার্যকর হয় না, উদাহরণস্বরূপ, সঞ্চিত পদ্ধতিতে দুটি টেম্প-টেবিল ব্যবহার করা হয়।
নিক_ন_এ

34

অস্থায়ী টেবিল ব্যবহার করা প্রয়োজন হয় না।

এটি আমার সমাধান

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue

2
এটি আপনাকে নিজের সার্ভার হিসাবে একটি লিঙ্কযুক্ত সার্ভার হিসাবে যুক্ত করা দরকার তবে এটি একটি কবজির মতো কাজ করে! ধন্যবাদ!
vaheeds

এটির জন্য দুর্দান্ত কিছু সতর্কতা: স্ট্যাকওভারফ্লো.com
কিথ অ্যাডলার

1
হুম ... আমি ত্রুটিটি পাচ্ছি "ত্রুটি 7411: সার্ভার 'আপনার সার্ভারনেম' ডেটা অ্যাক্সেসের জন্য কনফিগার করা হয়নি" " আমার কী পরিবর্তন দরকার?
ম্যাট

আপনি কি একটি লিঙ্কযুক্ত সার্ভার হিসাবে আপনার সার্ভার যুক্ত করেছেন? আপনার সার্ভারের নামটি আপনার সার্ভারের নাম। আপনাকে আপনার আসল সার্ভার নামের সাথে আপনার সার্ভারের নামটি পরিবর্তন করতে হবে।
ডেভিডডিএম

@ ম্যাট:sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
অ্যালেক্সকোভেলস্কি

23

আপনি এসপি থেকে টেম্পোরোটির টেবিলে আউটপুট অনুলিপি করতে পারেন।

CREATE TABLE #GetVersionValues
(
    [Index] int,
    [Name]  sysname,
    Internal_value  int,
    Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues

7

বিকল্পগুলি ব্যবহার করুন এবং কার্যকর করুন সেট 'FMTONLY অফ সেট করুন'; অন ​​নোট সেট করুন; '

এই নমুনা কোডটি ব্যবহার করে দেখুন:

SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')

6

আপনার পদ্ধতিটি একটি ইনলাইন ফাংশনে রূপান্তর করার চেষ্টা করুন যা নীচের মত একটি টেবিল ফেরত দেয়:

CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)

এবং তারপরে আপনি এটি হিসাবে কল করতে পারেন

SELECT * FROM MyProc()

আপনার কাছে ফাংশনটিতে প্যারামিটারগুলি নিম্নরূপে পাস করার বিকল্প রয়েছে:

CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 

এবং এটি কল

SELECT * FROM FuncName ( @para1 , @para2 )

6

যদি 'ডেটা অ্যাক্সেস' মিথ্যা হয়,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

পরে,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

এটা কাজ করে।


5

আপনি ওপেনরোসেট দিয়ে কিছুটা প্রতারণা করতে পারেন:

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

এটি অবশ্যই সম্পূর্ণ এসপি প্রতিবার চালিত করবে অবশ্যই।


4

সরলতার স্বার্থে এবং এটিকে পুনরায় চালনার যোগ্য করার জন্য, আমি ডেটা পেতে একটি সিস্টেম স্টোরডপ্রসেসার "sp_readerrorlog" ব্যবহার করেছি:

-----USING Table Variable
DECLARE @tblVar TABLE (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(MAX),
   [Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar



-----(OR): Using Temp Table
IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
CREATE TABLE #temp (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(55),
   Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp

1

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


1

যদি আপনার সার্ভারকে উদাহরণস্বরূপ SERVERX বলা হয় তবে আমি এটি এটি করেছিলাম ...

EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = 'STUDENT01';
SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
EXEC (@CMD);

এই কাজটি পরীক্ষা করার জন্য, আমি EXEC()কমান্ড লাইনটি মন্তব্য করেছি এবং এটি SELECT @CMDসম্পাদন করার চেষ্টা করার আগে কমান্ডটি পর্যালোচনা করার জন্য এটি প্রতিস্থাপন করেছি! এটি নিশ্চিত করা ছিল যে সমস্ত সঠিক সংখ্যার একক-কোটগুলি সঠিক জায়গায় ছিল। :-)

আমি আশা করি যে কাউকে সাহায্য করবে

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