복붙노트

[SQL] SQL 서버 저장 프로 시저는 테이블을 반환

SQL

SQL 서버 저장 프로 시저는 테이블을 반환

나는 두 개의 매개 변수에 걸리는 저장 프로 시저가 있습니다. 나는 서버 관리 Studio에서 성공적으로 실행할 수 있습니다. 그것은 나에게 내가 예상대로 결과를 보여줍니다. 그러나 그것은 또한 반환 값을 반환합니다.

그것은이 라인을 추가했습니다

 SELECT 'Return Value' = @return_value

나는 결과에 나를 보여 테이블을 반환하는 저장 프로 시저를하고자하지 내가 MATLAB에서이 저장 프로 시저를 호출하고 그것을 반환 모두에 해당하거나 거짓으로 반환 값.

나는 그것을 반환해야하는지 내 저장 프로 시저에 지정해야합니까? 그렇다면 어떻게 4 열 (VARCHAR (10), 부동, 플로트, 플로트)의 테이블을 지정합니까?

해결법

  1. ==============================

    1.프로시 같은 테이블을 반환 할 수 없습니다. 그러나 당신은 프로 시저에서 테이블에서 선택하고 같은 테이블 (또는 테이블 변수)로 안내 할 수 있습니다 :

    프로시 같은 테이블을 반환 할 수 없습니다. 그러나 당신은 프로 시저에서 테이블에서 선택하고 같은 테이블 (또는 테이블 변수)로 안내 할 수 있습니다 :

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

    2.나는 자주 더 일관성과 단순화 코드를 확인하기 위해 표 유형을 사용하여이 작업을 수행. 당신은 기술적으로 "테이블"을 반환 할 수 없습니다,하지만 당신은 결과 집합을 반환 할 수 있습니다 및 INSERT INTO ... EXEC ... 구문을 사용하여, 당신은 분명히 PROC를 호출 할 수 있으며, 테이블 타입으로 결과를 저장합니다. 다음 예에서 사실 테이블 변수로 그와 함께 다음 작업을 할 수 있습니다 나는 효과적으로 "테이블을 반환"야, 내가 로직을 추가 할 필요가 또 다른 PARAM과 함께 PROC에 테이블을 전달하고 있어요.

    나는 자주 더 일관성과 단순화 코드를 확인하기 위해 표 유형을 사용하여이 작업을 수행. 당신은 기술적으로 "테이블"을 반환 할 수 없습니다,하지만 당신은 결과 집합을 반환 할 수 있습니다 및 INSERT INTO ... EXEC ... 구문을 사용하여, 당신은 분명히 PROC를 호출 할 수 있으며, 테이블 타입으로 결과를 저장합니다. 다음 예에서 사실 테이블 변수로 그와 함께 다음 작업을 할 수 있습니다 나는 효과적으로 "테이블을 반환"야, 내가 로직을 추가 할 필요가 또 다른 PARAM과 함께 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
    
  3. ==============================

    3.테이블을 반환 할 수 및 쿼리에 사용되는 함수를 만드는 것이 좋습니다.

    테이블을 반환 할 수 및 쿼리에 사용되는 함수를 만드는 것이 좋습니다.

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

    4.값은 저장 프로 시저에 의해 반환되는 상태에만 INT 데이터 타입이 될 수 있습니다. 당신은 RETURN 문에 다른 데이터 유형을 반환 할 수 없습니다.

    값은 저장 프로 시저에 의해 반환되는 상태에만 INT 데이터 타입이 될 수 있습니다. 당신은 RETURN 문에 다른 데이터 유형을 반환 할 수 없습니다.

    에서 2 장 : 설계 저장 프로 시저 :

    여전히 SP에서 반환 된 테이블을 원한다면, 당신은 어느 쪽 XML 데이터 형식을 전달하는 출력 변수에 SP 또는 넥타이 내에서 SELECT에서 반환 된 레코드 세트를 작동해야합니다.

    HTH,

    남자

  5. ==============================

    5.당신이 결과 집합 및 반환 값을 모두 원하는 경우는 반환 값 대신 출력 매개 변수를 사용할 수 있습니다

    당신이 결과 집합 및 반환 값을 모두 원하는 경우는 반환 값 대신 출력 매개 변수를 사용할 수 있습니다

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

    6.나는 비슷한 상황이 있었다 같은 필드가 원래 저장 프로 시저에 의해 반환과 절차 내에서 임시 테이블을 사용하여 해결할 :

    나는 비슷한 상황이 있었다 같은 필드가 원래 저장 프로 시저에 의해 반환과 절차 내에서 임시 테이블을 사용하여 해결할 :

    CREATE PROCEDURE mynewstoredprocedure
    AS 
    BEGIN
    
    INSERT INTO temptable (field1, field2)
    EXEC mystoredprocedure @param1, @param2
    
    select field1, field2 from temptable
    
    -- (mystoredprocedure returns field1, field2)
    
    END
    
  7. ==============================

    7.

    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 간부 [마스터] .dbo.sp_executesql @q 삽입 @data에서 다음 가져 @의 C로, B @ 종료 가까운 @data 할당 해제 @data @T에서 *를 선택 반환 종료

  8. ==============================

    8.이 질문은 공유에 내 자신을 멈출 수 없다 아주 오래된하지만 소프트웨어 개발 I에서와 같이 새로운이지만 내가 배운 것을 : D를

    이 질문은 공유에 내 자신을 멈출 수 없다 아주 오래된하지만 소프트웨어 개발 I에서와 같이 새로운이지만 내가 배운 것을 : D를

    저장 프로 시저의 생성 :

    CREAET 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'
    

    출력 :

  9. ==============================

    9.여기에 두 테이블과 반환 값을 반환하는 SP의 예입니다. 당신이 반환은 "반환 값"을 필요로하고 내가 더 MATLAB에 대한 아이디어와 무엇을 필요가없는 경우 모르겠어요.

    여기에 두 테이블과 반환 값을 반환하는 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
    
  10. from https://stackoverflow.com/questions/22963939/sql-server-stored-procedure-return-a-table by cc-by-sa and MIT license