programing

SQL Server 저장 프로시저 테이블 반환

abcjava 2023. 6. 20. 21:19
반응형

SQL Server 저장 프로시저 테이블 반환

두 가지 매개 변수를 사용하는 저장 프로시저가 있습니다.Server Management Studio에서 성공적으로 실행할 수 있습니다.그것은 제가 기대하는 결과를 보여줍니다.그러나 반환 값도 반환합니다.

이 행을 추가했습니다.

 SELECT 'Return Value' = @return_value

저장 프로시저가 MATLAB에서 이 저장 프로시저를 호출할 때 반환 값이 아닌 결과에 표시된 표를 반환하고 싶습니다. 반환되는 모든 것은 true 또는 false입니다.

저장 프로시저에서 반환할 항목을 지정해야 합니까?그렇다면 4개 열(varchar(10), float, float, float)의 테이블을 어떻게 지정합니까?

프로시저는 테이블을 반환할 수 없습니다.그러나 프로시저의 테이블에서 선택하여 다음과 같은 테이블(또는 테이블 변수)로 이동할 수 있습니다.

create procedure p_x
as
begin
declare @t table(col1 varchar(10), col2 float, col3 float, col4 float)
insert @t values('a', 1,1,1)
insert @t values('b', 2,2,2)

select * from @t
end
go

declare @t table(col1 varchar(10), col2 float, col3 float, col4 float)
insert @t
exec p_x

select * from @t

이 작업은 일관성을 높이고 코드를 단순화하기 위해 표 유형을 사용하여 자주 수행합니다."를 반환할, 하고 "표"를 사용하여 반환할 수 .INSERT INTO .. EXEC ...구문을 사용하면 PROC를 명확하게 호출하여 결과를 테이블 형식으로 저장할 수 있습니다.다음 예제에서는 논리를 추가해야 하는 다른 매개 변수와 함께 테이블을 PROC로 전달하고, 그런 다음 테이블을 효과적으로 "반복"하고 테이블 변수로 사용할 수 있습니다.

/****** Check if my table type and/or proc exists and drop them ******/
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'returnTableTypeData')
DROP PROCEDURE returnTableTypeData
GO
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'myTableType')
DROP TYPE myTableType
GO

/****** Create the type that I'll pass into the proc and return from it ******/
CREATE TYPE [dbo].[myTableType] AS TABLE(
    [someInt] [int] NULL,
    [somenVarChar] [nvarchar](100) NULL
)
GO

CREATE PROC returnTableTypeData
    @someInputInt INT,
    @myInputTable myTableType READONLY --Must be readonly because
AS
BEGIN

    --Return the subset of data consistent with the type
    SELECT
        *
    FROM
        @myInputTable
    WHERE
        someInt < @someInputInt

END
GO


DECLARE @myInputTableOrig myTableType
DECLARE @myUpdatedTable myTableType

INSERT INTO @myInputTableOrig ( someInt,somenVarChar )
VALUES ( 0, N'Value 0' ), ( 1, N'Value 1' ), ( 2, N'Value 2' )

INSERT INTO @myUpdatedTable EXEC returnTableTypeData @someInputInt=1, @myInputTable=@myInputTableOrig

SELECT * FROM @myUpdatedTable


DROP PROCEDURE returnTableTypeData
GO
DROP TYPE myTableType
GO

테이블을 반환하고 쿼리에 사용할 수 있는 함수를 만드는 것을 고려해 보십시오.

https://msdn.microsoft.com/en-us/library/ms186755.aspx

함수와 프로시저의 주요 차이점은 함수가 테이블을 변경하지 않는다는 것입니다.값만 반환합니다.

이 예에서는 주어진 테이블에 null이거나 비어 있지 않은 모든 열의 개수를 제공하는 쿼리를 만듭니다.

이것을 청소하는 방법은 아마 여러 가지가 있을 것입니다.하지만 그것은 기능을 잘 보여줍니다.

USE Northwind

CREATE FUNCTION usp_listFields(@schema VARCHAR(50), @table VARCHAR(50))
RETURNS @query TABLE (
    FieldName VARCHAR(255)
    )
BEGIN
    INSERT @query
    SELECT
        'SELECT ''' + @table+'~'+RTRIM(COLUMN_NAME)+'~''+CONVERT(VARCHAR, COUNT(*)) '+
    'FROM '+@schema+'.'+@table+' '+
          ' WHERE isnull("'+RTRIM(COLUMN_NAME)+'",'''')<>'''' UNION'
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table and TABLE_SCHEMA = @schema
    RETURN
END

그런 다음 기능을 실행합니다.

SELECT * FROM usp_listFields('Employees')

는 다음과 같은 여러 행을 생성합니다.

SELECT 'Employees~EmployeeID~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("EmployeeID",'')<>'' UNION
SELECT 'Employees~LastName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("LastName",'')<>'' UNION
SELECT 'Employees~FirstName~'+CONVERT(VARCHAR, COUNT(*)) FROM dbo.Employees  WHERE isnull("FirstName",'')<>'' UNION

저도 비슷한 상황이 있었는데 절차 내부의 임시 테이블을 사용하여 해결했으며 원래 저장 프로시저에서 동일한 필드를 반환했습니다.

CREATE PROCEDURE mynewstoredprocedure
AS 
BEGIN

INSERT INTO temptable (field1, field2)
EXEC mystoredprocedure @param1, @param2

select field1, field2 from temptable

-- (mystoredprocedure returns field1, field2)

END

결과 세트와 반환 값을 모두 원하는 경우 반환 값 대신 out 매개 변수를 사용할 수 있습니다.

CREATE PROCEDURE proc_name 
@param int out
AS
BEGIN
    SET @param = value
SELECT ... FROM [Table] WHERE Condition
END
GO

저장 프로시저에서 반환하는 상태 값은 INT 데이터 유형만 될 수 있습니다.RETURN 문에서 다른 데이터 유형을 반환할 수 없습니다.

제2과: 저장 프로시저 설계:

모든 저장 프로시저는 실행 상태 값 또는 반환 코드로 알려진 정수 값을 반환할 수 있습니다.

SP에서 테이블을 반환하려면 SP 내의 SELECT에서 반환된 레코드 세트를 작업하거나 XML 데이터 유형을 전달하는 OUTPUT 변수에 연결해야 합니다.

HTH,

존.

이 질문은 매우 오래되었지만 소프트웨어 개발의 새로운 질문으로서 저는 제가 배운 것을 공유하는 것을 멈출 수 없습니다.d

저장 프로시저 만들기:

CREATE PROC usp_ValidateUSer
(
    @UserName nVARCHAR(50),
    @Password nVARCHAR(50)
)
AS
BEGIN
    IF EXISTS(SELECT '#' FROM Users WHERE Username=@UserName AND Password=@Password)
    BEGIN
        SELECT u.UserId, u.Username, r.UserRole
        FROM Users u
        INNER JOIN UserRoles r
        ON u.UserRoleId=r.UserRoleId
    END
END

저장 프로시저 실행:

(SQL에서 저장 프로시저 실행을 테스트하려는 경우)

EXEC usp_ValidateUSer @UserName='admin', @Password='admin'

출력:

enter image description here

create procedure PSaleCForms
as
begin
declare 
@b varchar(9),
@c nvarchar(500),
@q nvarchar(max)
declare @T table(FY nvarchar(9),Qtr int,title nvarchar    (max),invoicenumber     nvarchar(max),invoicedate datetime,sp decimal    18,2),grandtotal decimal(18,2))
declare @data cursor
set @data= Cursor
forward_only static
for 
select x.DBTitle,y.CurrentFinancialYear from [Accounts     Manager].dbo.DBManager x inner join [Accounts Manager].dbo.Accounts y on        y.DBID=x.DBID where x.cfy=1
open @data
fetch next from @data
into @c,@b
while @@FETCH_STATUS=0
begin
set @q=N'Select '''+@b+''' [fy], case cast(month(i.invoicedate)/3.1 as int)     when 0 then 4 else cast(month(i.invoicedate)/3.1 as int) end [Qtr],     l.title,i.invoicenumber,i.invoicedate,i.sp,i.grandtotal from     ['+@c+'].dbo.invoicemain i inner join  ['+@c+'].dbo.ledgermain l on     l.ledgerid=i.ledgerid where (sp=0 or stocktype=''x'') and invoicetype=''DS'''

@T exec [master]에 삽입합니다. dbo.sp_executesql @q fetch from @data into @c, @bend close @data deallocate @data select * from @T return end

다음은 테이블과 반환 값을 모두 반환하는 SP의 예입니다.저는 당신이 "반환가"가 필요한지도 모르고 MATLAB과 그것이 무엇을 요구하는지도 전혀 모릅니다.

CREATE PROCEDURE test
AS 
BEGIN

    SELECT * FROM sys.databases

    RETURN 27
END

--Use this to test
DECLARE @returnval int

EXEC @returnval = test 

SELECT @returnval

언급URL : https://stackoverflow.com/questions/22963939/sql-server-stored-procedure-return-a-table

반응형