복붙노트

[SQL] 저장 프로 시저의 반환 결과 세트 대신 int로

SQL

저장 프로 시저의 반환 결과 세트 대신 int로

나는 동적 선택이 포함 된 저장 프로 시저가 있습니다. 이 같은:

ALTER PROCEDURE [dbo].[usp_GetTestRecords] 
    --@p1 int = 0, 
    --@p2 int = 0
    @groupId nvarchar(10) = 0
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @query  NVARCHAR(max)

    SET @query = 'SELECT * FROM CUSTOMERS WHERE Id = ' + @groupId
    /* This actually contains a dynamic pivot select statement */

    EXECUTE(@query);
END

SSMS에서 저장 프로 시저는 벌금을 실행하고 쇼 설정을 발생합니다.

엔티티 프레임 워크를 사용하여 C #에서 대신을 IEnumerable의 int를 반환 보여줍니다?

private void LoadTestRecords()
{
    TestRecordsDBEntities dataContext = new TestRecordsDBEntities();
    string id = ddlGroupId.SelectedValue;

    List<TestRecord> list = dataContext.usp_GetTestRecords(id); //This part doesn't work returns int
    GridView1.DataSource = list;
}

usp_GetTestRecords에 대한 생성 기능

public virtual int usp_GetTestRecords(string groupId)
{
    var groupIdParameter = groupId != null ?
        new ObjectParameter("groupId", groupId) :
        new ObjectParameter("groupId", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("usp_GetTestRecords", groupIdParameter);
}

해결법

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

    1.엔티티 프레임 워크는 저장 프로 시저가 반환하는 것을 말할 수 없다. 나는 성공 테이블 변수를 생성 했어 거울 당신의 SELECT 문에서 데이터. 그냥 다음 해당 테이블 변수에서 선택합니까 테이블 변수에 삽입합니다. EF는 그것을 선택해야합니다.

    엔티티 프레임 워크는 저장 프로 시저가 반환하는 것을 말할 수 없다. 나는 성공 테이블 변수를 생성 했어 거울 당신의 SELECT 문에서 데이터. 그냥 다음 해당 테이블 변수에서 선택합니까 테이블 변수에 삽입합니다. EF는 그것을 선택해야합니다.

  2. ==============================

    2.나는이 같은 임시 테이블에 대한 "간부"전화를 포함하는 저장 프로 시저가있을 때 나는이 얻을 :

    나는이 같은 임시 테이블에 대한 "간부"전화를 포함하는 저장 프로 시저가있을 때 나는이 얻을 :

    insert into #codes (Code, ActionCodes, Description)
    exec TreatmentCodes_sps 0
    

    엔티티 프레임 워크는 절차에 의해 반환되는 것과 혼동됩니다 것으로 보인다. 내가 건너 한이 솔루션은 SPROC의 상단에이를 추가하는 것입니다 :

    SET FMTONLY OFF
    

    이 후, 모두 잘 있습니다.

  3. ==============================

    3.저도 같은 문제를 가지고, 여기에 해결책을 발견

    저도 같은 문제를 가지고, 여기에 해결책을 발견

    그것은 당신이 지금 필요로하는 무슨이어야한다.

  4. ==============================

    4.이 스택 오버플로 게시물에 라디 Mrnka의 답변을 참조하십시오 https://stackoverflow.com/a/7131344/4318324

    이 스택 오버플로 게시물에 라디 Mrnka의 답변을 참조하십시오 https://stackoverflow.com/a/7131344/4318324

    나도 같은 기본적인 문제가 있었다.

    첨가

    SET FMTONLY OFF
    

    절차에이 문제를 해결합니다 가져 오는 동안 가져 오기 위해 노력하고 있습니다. 이 데이터베이스의 목적은 EF (엔티티 프레임 워크)에 대한 스키마를 제공하기 위해 단독으로하지 않는 한 이후에 줄을 제거하는 좋은 연습입니다.

    주의 주된 이유는 메타 데이터를 획득 할 때 EF 데이터 돌연변이를 방지하기 위해이 설정을 사용한다는 것입니다.

    당신이 데이터베이스에서 개체 모델을 새로 고치면 그들이 줄 어떤 절차는 잠재적으로 바로 스키마를 얻기 위해 노력하여 해당 데이터베이스의 데이터를 업데이트 할 수 있습니다.

    나는 그것이 다른 링크를 통해 완벽하게 스캔에 필요하지 않은 것이 때문에에 추가 메모를 추가하고 싶었다.

    당신이 FMTONLY 여기에 사용하려고 할 경우 유의해야 할 몇 가지 있습니다.

    when FMTONLY is on:
      1) only the schema is returned (no) rows.
         similar to adding a blanket false statement to your where clause (ie "where 1=0")
      2) flow control statements are ignored
    

    set fmtonly on
    
    if 1=1
    begin
        select 1 a
    end
    else
    begin
        select 1 a,2 b
    end
    
    while 1=1
    select 1 c
    

    세 가지 질의 각각에 대한 위의 반환 NO 행 무엇이든지 및 메타 데이터

    이러한 이유로 어떤 사람들은 흐름 제어의 그것의 비 준수를 활용하는 방법으로 그것을 떨어져 전환 제안

    if 1=0
    begin
        set fmtonly off
    end
    

    사실이를 추적하는이 논리를 소개하는 데 사용할 수있는

    set fmtonly off
    declare @g varchar(30)
    set @g = 'fmtonly was set to off'
    
    if 1=0
    begin
        set fmtonly off
        set @g = 'fmtonly was set to on' 
    end
    
    select @g
    

    생각 매우 신중하게이 모두 사용되지 않습니다으로이 기능을 사용하기 전에 잠재적으로 따라 SQL 매우 하드합니다

    이해 될 필요가있는 주요 개념은 다음과 같다

    1. EF turns FMTONLY on to prevent MUTATING data from executing stored procedures
       when it executes them during a model update.
       (from which it follows)
    
    2. setting FMTONLY off in any procedure that EF will attempt to do a schema scan
       (potentially ANY and EACHONE) introduces the potential to mutate database
       data whenever *anyone* attempts to update their database model.
    
  5. ==============================

    5.저장 프로 시저가 결과 집합의 기본 키가없는 경우 엔티티 프레임 워크가 자동으로 스칼라 값을 반환합니다. 따라서, 당신은 엔티티 프레임 워크는 저장 프로 시저의 결과 집합을 반환에 대한 귀하의 선택 문에서 기본 키 열을 포함하거나, 위해 기본 키와 임시 테이블을 만들어야 할 것입니다.

    저장 프로 시저가 결과 집합의 기본 키가없는 경우 엔티티 프레임 워크가 자동으로 스칼라 값을 반환합니다. 따라서, 당신은 엔티티 프레임 워크는 저장 프로 시저의 결과 집합을 반환에 대한 귀하의 선택 문에서 기본 키 열을 포함하거나, 위해 기본 키와 임시 테이블을 만들어야 할 것입니다.

  6. ==============================

    6.당신이 당신의 저장 프로 시저 모델 클래스를 생성 할 때, 당신은 실수로 스칼라 반환 결과를 선택했다. 당신은 저장 프로 시저를 다시 추가 한 후, 엔터티 모델에서 저장 프로 시저를 제거해야합니다. 저장 프로 시저에 대한 대화 상자에서, 당신은 당신이 기대하는 반환 형식을 선택할 수 있습니다. 방금 생성 된 코드를 편집하지 마십시오 ..이 이제 작동 할 수 있지만 당신은 모델에 다른 변경하는 경우 생성 된 코드는 교체 할 수 있습니다.

    당신이 당신의 저장 프로 시저 모델 클래스를 생성 할 때, 당신은 실수로 스칼라 반환 결과를 선택했다. 당신은 저장 프로 시저를 다시 추가 한 후, 엔터티 모델에서 저장 프로 시저를 제거해야합니다. 저장 프로 시저에 대한 대화 상자에서, 당신은 당신이 기대하는 반환 형식을 선택할 수 있습니다. 방금 생성 된 코드를 편집하지 마십시오 ..이 이제 작동 할 수 있지만 당신은 모델에 다른 변경하는 경우 생성 된 코드는 교체 할 수 있습니다.

  7. ==============================

    7.나는 내가 'AS'키워드로 반환 필드의 이름을 변경하고 내 문제를 해결, 같은 문제가 있었다. 이 문제에 대한 한 가지 이유는 SQL 서버 예약 된 키워드 열 이름을 명명한다.

    나는 내가 'AS'키워드로 반환 필드의 이름을 변경하고 내 문제를 해결, 같은 문제가 있었다. 이 문제에 대한 한 가지 이유는 SQL 서버 예약 된 키워드 열 이름을 명명한다.

    이 예는 휴한지입니다 :

    ALTER PROCEDURE [dbo].[usp_GetProducts]
    
    AS
    BEGIN
    
     SET NOCOUNT ON;
    
     SELECT 
          , p.Id
          , p.Title
          , p.Description AS 'Description'
    
        FROM dbo.Products AS p
    END
    
  8. ==============================

    8.나는이 조금 깊이 생각하고 내가 더 나은 / 간단한 답이 있다고 생각

    나는이 조금 깊이 생각하고 내가 더 나은 / 간단한 답이 있다고 생각

    당신은 단지 (aquire 스키마에 FMTONLY 태그를 사용하는 엔티티 프레임 워크의 현재 버전에 대한) 약간의 성사 엔티티 프레임 워크를 제공하는 저장 한 경우

    저장 프로 시저의 시작 부분에 다음을 수행 고려한다.

    --where [columnlist] matches the schema you want EF to pick up for your stored procedure
    
    if 1=0
    begin
        select 
           [columnlist]
        from [table list and joins]
        where 1=0
    end
    

    당신은 테이블 변수로 결과 집합을로드 좋아하는 경우 당신은 동기화 스키마를 유지 도움말을 다음을 수행 할 수 있습니다

    declare @tablevar as table
    (
        blah int
        ,moreblah varchar(20)
    )
    
    if 1=0
    begin
        select * from @tablevar
    end
    
    ...
    -- load data into @tablevar
    select * from @tablevar
    
  9. ==============================

    9.최고의 솔루션 I의 FOUND는 약간의 속임수입니다.

    최고의 솔루션 I의 FOUND는 약간의 속임수입니다.

    가게 절차, 주석 모두에서, '= 선별 [foo는]으로 첫 선을 넣어', [바] = ''등 ... 이제, 매핑 기능으로 이동 모델을 업데이트 복잡한 유형을 선택하고 가져 오기 열 정보를 클릭 한 후 복합 유형을 만듭니다.

    이제 가짜가 선택 언급하고 실제 저장 프로 시저 본문을 주석을 해제.

  10. ==============================

    10.단지 변화

    단지 변화

    ALTER PROCEDURE [dbo].[usp_GetTestRecords] 
        --@p1 int = 0, 
        --@p2 int = 0
        @groupId nvarchar(10) = 0
    AS
    BEGIN
        SET NOCOUNT ON;
    
    
        SELECT * FROM CUSTOMERS WHERE Id =  @groupId
    
    END
    
  11. ==============================

    11.나는이 오래된 스레드 알고 있지만 경우에 누군가가 내 불황을 말해주지 같은 문제가있다.

    나는이 오래된 스레드 알고 있지만 경우에 누군가가 내 불황을 말해주지 같은 문제가있다.

    문제를 찾을 수있는 도움으로, 당신은 당신의 저장된 프로 시저를 추가 SQL 프로파일 러를 실행합니다. 그럼 당신은 엔티티 프레임 워크는 당신의 결과 집합을 생성하는 매개 변수로 전달되는 것을 볼 수 있습니다. 나는 거의 항상 상상이 널 (null) 매개 변수 값을 전달합니다. 당신이 문자열 값과 매개 변수 값을 연결하여 즉석에서 SQL을 생성하는 일부가 null의 경우 다음 SQL은 중단하고 당신은 반환 세트를 얻을 실 거예요.

    나는 임시 테이블 또는 아무것도 그냥 exec 명령을 생성하는 데 필요한하지 않았습니다.

    희망이 도움이

  12. ==============================

    12.이 작업을 수행해야하는 경우에, 당신은 단지 dbcontext의 부분을 만들고 당신이 필요로하는 데이터를 반환은 SQLQuery를 사용하는 C #을 함수를 직접 만들어 더 나은을 수 있습니다. 장점 몇 가지 다른 옵션이 이상 :

    이 작업을 수행해야하는 경우에, 당신은 단지 dbcontext의 부분을 만들고 당신이 필요로하는 데이터를 반환은 SQLQuery를 사용하는 C #을 함수를 직접 만들어 더 나은을 수 있습니다. 장점 몇 가지 다른 옵션이 이상 :

    예제 코드 :

     public partial class myEntities
        {
           public List<MyClass> usp_GetTestRecords(int _p1, int _p2, string _groupId)
           {
              // fill out params
              SqlParameter p1 = new SqlParameter("@p1", _p1);
              ...
              obj[] parameters = new object[] { p1, p2, groupId };
    
              // call the proc
              return this.Database.SqlQuery<MyClass>(@"EXECUTE usp_GetTestRecords @p1, @p2, @groupId", parameters).ToList();
           }
        }
    
  13. ==============================

    13.가져 오는 동안

    가져 오는 동안

    SET FMTONLY ON SP에 스키마를 가지고 사용할 수 있습니다.

    당신이 SP를 변경하고 새로운 하나를 업데이트 할 경우 모델 브라우저에서 SP를 삭제하지만, 그것은 edmx 삭제되지 않기 때문에, 당신은 (XML)에서 edmx 파일에서 기존 정의 함수를 삭제해야합니다. 예를 들어;

        <FunctionImport Name="GetInvoiceByNumber"     ReturnType="Collection(Model.Invoice_Result)">
           <Parameter Name="InvoiceNumber" Mode="In" Type="Int32" />
        </FunctionImport>
    

    저도 같은 문제가 있었는데, 나는 완전히 SP 대응의 FuctionImport 태그를 삭제하면,이 모델은 바로 업데이트되었습니다. 당신은 비주얼 스튜디오에서 함수 이름을 검색하여 태그를 찾을 수 있습니다.

  14. ==============================

    14.그런 다음 기능 수입, 더블 클릭에 문제가있는 저장 프로 시저를 진행 한 후 수동으로 "새 복합 형식 만들기"를 클릭 한 후 "열 정보 가져 오기"를 클릭하고, 모델 브라우저까지 행운 개방을 가질 수있다. 이것은 보통 문제를 정렬합니다.

    그런 다음 기능 수입, 더블 클릭에 문제가있는 저장 프로 시저를 진행 한 후 수동으로 "새 복합 형식 만들기"를 클릭 한 후 "열 정보 가져 오기"를 클릭하고, 모델 브라우저까지 행운 개방을 가질 수있다. 이것은 보통 문제를 정렬합니다.

  15. ==============================

    15.잘 나는뿐만 아니라하지만 방법이 도움이 위의 온라인 검색 없음의 시간 후에이 문제를 가지고 있었다. 마지막으로 나는 당신의 저장 프로 시저가 null 같은 몇 가지 매개 변수를 받고있는 쿼리 실행에 어떤 오류가 발생하는 경우 일어날 것을 알게되었다. 엔티티 프레임 워크는 복잡한 개체 모델을 정의하여 저장 프로 시저에 대한 방법을 생성합니다. 때문에이 널 (null) 값으로 저장 프로 시저 반환 및 INT 값 것이다.

    잘 나는뿐만 아니라하지만 방법이 도움이 위의 온라인 검색 없음의 시간 후에이 문제를 가지고 있었다. 마지막으로 나는 당신의 저장 프로 시저가 null 같은 몇 가지 매개 변수를 받고있는 쿼리 실행에 어떤 오류가 발생하는 경우 일어날 것을 알게되었다. 엔티티 프레임 워크는 복잡한 개체 모델을 정의하여 저장 프로 시저에 대한 방법을 생성합니다. 때문에이 널 (null) 값으로 저장 프로 시저 반환 및 INT 값 것이다.

    상점 절차 중 하나를 널 (null) 값과의 제공 빈 결과 집합을 확인하시기 바랍니다. 그것은 당신의 문제가 해결됩니다. 바라 건데.

  16. ==============================

    16.내가, 내가 정확히 할 수있는 것을 모르는이 데이터베이스에 대한 사용 권한의 문제라고 생각하지만, 내 일에 우리가 데이터베이스에이 계정이 특별히 응용 프로그램에 생성하여 연결 애플리케이션을 부여 할 Active Directory 사용자를 사용하여 각 응용 프로그램 음, 개발자로서 내가 무슨 짓을했는지, 다음, 내가 읽기, 쓰기 및 기타 기본적인 것들을, 아니 ALTER, 그리고 더 고급 기능에 대한 권한을 가지고 있고, 내 일반 계정으로 비주얼 스튜디오를 실행이 같은 문제를 가지고, 자신의 사용자 계정이 비주얼 스튜디오는 상황에 맞는 메뉴의 "다른 사용자로"옵션을 선택 열고, 그리고! 지금 내 저장 프로 시저가 그 전에 내가 기대 한 모든 필드와로드입니다 나는 응용 프로그램과 짜잔 위해 부여 된 AD 로그인을 넣어 내 저장 프로 시저 (int)로 복귀했다. 나는이 도움말 사람, 어쩌면 데이터베이스 계정에 뷰 정의 권한이 트릭을 할 희망

    내가, 내가 정확히 할 수있는 것을 모르는이 데이터베이스에 대한 사용 권한의 문제라고 생각하지만, 내 일에 우리가 데이터베이스에이 계정이 특별히 응용 프로그램에 생성하여 연결 애플리케이션을 부여 할 Active Directory 사용자를 사용하여 각 응용 프로그램 음, 개발자로서 내가 무슨 짓을했는지, 다음, 내가 읽기, 쓰기 및 기타 기본적인 것들을, 아니 ALTER, 그리고 더 고급 기능에 대한 권한을 가지고 있고, 내 일반 계정으로 비주얼 스튜디오를 실행이 같은 문제를 가지고, 자신의 사용자 계정이 비주얼 스튜디오는 상황에 맞는 메뉴의 "다른 사용자로"옵션을 선택 열고, 그리고! 지금 내 저장 프로 시저가 그 전에 내가 기대 한 모든 필드와로드입니다 나는 응용 프로그램과 짜잔 위해 부여 된 AD 로그인을 넣어 내 저장 프로 시저 (int)로 복귀했다. 나는이 도움말 사람, 어쩌면 데이터베이스 계정에 뷰 정의 권한이 트릭을 할 희망

  17. ==============================

    17.SQL 인증 장소에있는 경우, 데이터베이스에 엔티티 프레임 워크를 연결하는 데 사용되는 사용자 자격 증명 고객 테이블에서 읽을 수있는 적절한 권한이 있는지 확인합니다.

    SQL 인증 장소에있는 경우, 데이터베이스에 엔티티 프레임 워크를 연결하는 데 사용되는 사용자 자격 증명 고객 테이블에서 읽을 수있는 적절한 권한이 있는지 확인합니다.

    엔티티 프레임 워크는 복잡한 객체를 매핑 SQL 인증을 사용하는 경우와 같은 저장 프로 시저 내에서 테이블 중 하나가 읽기 권한을 설정하지 않는 경우, 매핑 대신 INT를 반환 발생합니다 (즉, 둘 이상의 열 이상에 select가 저장 프로 시저) 원하는 결과 세트.

  18. from https://stackoverflow.com/questions/18245567/stored-procedure-returns-int-instead-of-result-set by cc-by-sa and MIT license