저장 프로 시저의 출력 매개 변수 인 테이블 반환 매개 변수


33

Table-Valued 매개 변수를 저장 프로 시저의 출력 매개 변수로 사용할 수 있습니까?

여기 코드에서하고 싶은 일이 있습니다.

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

답변:



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

그런 다음 일부 데이터를 캡처하는 저장 프로 시저를 만듭니다. 일반적으로 여기에서 테이블 반환 출력 매개 변수를 만들려고합니다.

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

그가 제공 한 링크를 포함하여 remus의 멋진 답변 외에도

저장 프로 시저간에 데이터를 공유하는 방법

스토어드 프로 시저 결과를 테이블에 저장할 때 다음 오류 메시지가 표시되는 상황이 있습니다.

INSERT EXEC 문은 중첩 될 수 없습니다.

현재 트랜잭션을 커밋 할 수 없으며 로그 파일에 쓰는 작업을 지원할 수 없습니다. 거래 롤백

그리고 이것이 내가 사용하기 위해 개발 한 자체 저장 프로 시저에서 발생할 때

예를 들어 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그렇지 않으면 Sql Injection의 위험이 높은 것으로 간주됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.