সঞ্চিত পদ্ধতির আউটপুট প্যারামিটার হিসাবে সারণী-মূল্যবান পরামিতি


33

সারণী-মূল্যবান প্যারামিটারটি কি সঞ্চিত পদ্ধতির আউটপুট প্যারাম হিসাবে ব্যবহার করা যায়?

এখানে আমি কোড করতে চাই কি

/*First I create MY type */
CREATE TYPE typ_test AS TABLE 
(
     id int not null
    ,name varchar(50) not null
    ,value varchar(50) not null
    PRIMARY KEY (id)
)
GO


--Now I want to create stored procedu whic is going to send output type I created, 
--But it looks like it is inpossible, at least in SQL2008
create  PROCEDURE [dbo].sp_test
         @od datetime 
        ,@do datetime 
        ,@poruka varchar(Max) output
        ,@iznos money output 
        ,@racun_stavke  dbo.typ_test   READONLY --Can I Change READONLY with OUTPUT ?
AS
BEGIN
    SET NOCOUNT ON;

    /*FILL MY OUTPUT PARAMS AS I LIKE */


    end

উত্তর:


35

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


1

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

প্রথমে এর সাথে কাজ করার জন্য কিছু ডেটা তৈরি করুন:

create table tbl1
(
id int,
fname varchar(10),
gender varchar(10)
);
create table tbl2
(
id int,
lname varchar(10)
);
insert into tbl1
values
(1,'bob'  ,'m'),
(2,'tom'  ,'m'),
(3,'sally','f')
;
insert into tbl2
values
(1,'jones'   ),
(2,'johnson' ),
(3,'smith'   )
;

এরপরে, কিছু ডেটা ক্যাপচারের জন্য একটি সঞ্চিত পদ্ধতি তৈরি করুন। সাধারণত, আপনি এখানে সারণি-মূল্যবান আউটপুট প্যারামিটার তৈরি করার চেষ্টা করছেন this

create procedure usp_OUTPUT1
 @gender varchar(10)
as
Begin
    select id from tbl1 where gender = @gender
End

অতিরিক্তভাবে, আপনি একটি ডেটা টাইপ (টেবিলের ধরণ) তৈরি করতে চান যেখানে প্রথম সঞ্চিত পদ্ধতি থেকে ডেটা পরবর্তী সঞ্চিত পদ্ধতির ইনপুট প্যারামিটার হিসাবে পাস করা যেতে পারে।

create type tblType as Table (id int)

এরপরে, দ্বিতীয় সঞ্চিত পদ্ধতি তৈরি করুন যা টেবিলের মূল্যবান পরামিতি গ্রহণ করবে।

create procedure usp_OUTPUT2
@tblType tblType readonly  --referencing the type created and specify readonly
as
begin
 select lname from tbl2 where id in (select id from @tblType)
end

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

Declare @tblType tblType 
insert into @tblType execute usp_OUTPUT1 'm'
execute usp_OUTPUT2 @tblType

1

পাশাপাশি তিনি সরবরাহ করেছেন এমন লিঙ্ক সহ রিমাসের মাধ্যমে সুন্দরভাবে উত্তর দিন

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

এমন পরিস্থিতি রয়েছে যেখানে কোনও সঞ্চিত পদ্ধতির ফলাফলগুলি কোনও টেবিলে সংরক্ষণ করার সময় আপনি নিম্নলিখিত ত্রুটি বার্তা পান:

একটি INSERT এক্সেক বিবৃতি নেস্ট করা যাবে না।

বর্তমান লেনদেন প্রতিশ্রুতিবদ্ধ হতে পারে না এবং লগ ফাইলে লেখার অপারেশনগুলিকে সমর্থন করতে পারে না। লেনদেন পিছনে রোল

এবং যখন এটি আমার নিজের ব্যবহারের জন্য বিকাশিত আমার নিজস্ব সঞ্চিত পদ্ধতিতে ঘটে

উদাহরণস্বরূপ loginএকটি সার্ভারের সমস্ত ডেটাবেজে এটি সম্পর্কিত সমস্ত AD গোষ্ঠী এবং তাদের সমস্ত অনুমতি থেকে আমাকে বলার একটি সরঞ্জাম

আমি পদ্ধতির বাইরে একটি টেম্প টেবিল তৈরি করি এবং এর নামটি প্যারামিটার হিসাবে পাস করি

--===============
-- this way below it works, by passing a temp table as a parameter
--===============

                if OBJECT_ID('tempdb.dbo.#my_table') IS NOT NULL
                   DROP TABLE #my_table

                CREATE TABLE #my_table(
                    db nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                   permission_type nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                    login_  nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                    role_  nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                    Obj    nvarchar(517)   COLLATE Latin1_General_CI_AS  NULL,
                    Permission nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                    script nvarchar(1008)  COLLATE Latin1_General_CI_AS  NULL
                ) 

                exec sp_GetLoginDBPermissionsX 
                    @Login='my_loginname', 
                    @debug=0,
                    @where_to_save ='#my_table'

                select *
                from #my_table

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

            select @sql = case when @where_to_save IS not null then 
            '
            insert into ' + @where_to_save + '(db,Permission_Type,login_,role_,obj,Permission,script) '
            else '' end + 
'
        SELECT 
            J.db,
            J.Permission_Type,
            J.login_,
            J.role_,
            J.Obj,
            J.Permission,
            J.script
        FROM #tablewithpermissions J
        WHERE J.login_ IN ( SELECT  L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
           OR J.role_ IN  ( SELECT  L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
       ORDER BY J.DB, J.[permission_order]
'
        --print(@sql)

        EXEC(@SQL)

এর পরে আপনার কাছে স্ক্রিনে প্রয়োজনীয় তথ্য রয়েছে বা আপনি যদি প্যারামিটার হিসাবে কোনও টেম্প টেবিলটি পেরিয়ে গেছেন তবে এটিতে এখন ডেটা থাকবে।

এটি আমি খুঁজে পেয়েছি এমন একটি সমাধান, তবে আমি এটি কেবল নিজের কাজের জন্যই ব্যবহার করি DBAঅন্যথায় এটি এসকিএল ইঞ্জেকশনের জন্য উচ্চ ঝুঁকি হিসাবে বিবেচিত হবে ।

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