Kayıtlı prosedür için Çıkış parametresi olarak Tablo Değerli Parametre


33

Tablo-Değerli parametrenin saklı yordam için çıkış param değeri olarak kullanılması mümkün mü?

İşte kodda ne yapmak istediğim

/*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

Yanıtlar:



1

Bu eski bir gönderi, ancak "Saklı yordam için çıktı parametresi olarak Tablo Değerli Parametre" aranırken en üste yakındı. Tablo değerli bir parametreyi çıktı parametresi olarak geçiremezsiniz, hedefin tablo değerli çıktı parametresini başka bir prosedürde tablo değerli girdi parametresi olarak kullanmak olduğunu hayal ediyorum. Bu çalışmayı nasıl yaptığım için bir örnek göstereceğim.

İlk önce, çalışmak için bazı veriler oluşturun:

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'   )
;

Ardından, verilerin bir kısmını yakalamak için saklı bir prosedür oluşturun. Normalde bu, tablo değerli bir çıktı parametresi oluşturmaya çalıştığınız yer olacaktır.

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

Ek olarak, ilk saklı yordamdaki verilerin bir sonraki saklı yordam için girdi parametresi olarak geçirilebileceği bir veri türü (tablo türü) oluşturmak isteyeceksiniz.

create type tblType as Table (id int)

Ardından, tablo değerli parametreyi kabul edecek ikinci saklı yordamı oluşturun.

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

Verilmiş, bu doğru bir tablo değerli çıktı parametresi değildir, ancak muhtemelen aradığınıza benzer sonuçlar üretecektir. Tablo değerli parametrenizi belirtin, içine saklı yordamı uygulayarak verilerle doldurun, sonra bir sonraki yordam için girdi değişkeni olarak kullanın.

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

1

ek olarak verdiği bağlantıyı da içeren remus

Saklı yordamlar arasında veri paylaşımı

Saklı yordamın sonuçlarını bir tabloya kaydederken aşağıdaki hata iletilerini aldığınız durumlar vardır:

Bir INSERT EXEC deyimi iç içe geçemez.

Geçerli işlem gerçekleştirilemez ve günlük dosyasına yazılan işlemleri destekleyemez. İşlemi geri al

ve bu, kendi kullanımım için geliştirdiğim kendi saklı yordamlarımda gerçekleştiğinde

örneğin bana loginait olduğu tüm AD gruplarından ve sunucudaki tüm veritabanlarındaki tüm izinlerinden bahseden bir araç

Prosedürün dışında bir geçici tablo oluşturup adını parametre olarak iletiyorum

--===============
-- 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

ve tüm hesaplamalardan sonra, son verileri iade ettiğimde (örneğin altında) bir tabloya çıktı mı yoksa ekrana geri mi döndüğümüzü kontrol edip dinamik olarak komut dosyasını oluşturuyorum.

            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)

Bundan sonra, ekranda ihtiyacınız olan bilgiyi elde edersiniz ya da parametre olarak geçici bir tabloyu geçtiyseniz, şimdi verileri olacaktır.

Bu bulduğum bir çözüm, ancak bunu sadece kendi işlerim için kullanıyorum, DBAaksi takdirde Sql Injection için yüksek risk olarak kabul edilecektir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.