2012-09-24 2 views
2

반환 SQL Server에서 데이터를 쿼리하기 위해 쿼리 열기를 사용하여 간단한 SELECT 문 (SET NOCOUNT OFF로 설정)을 실행하는 저장 프로 시저를 만들었습니다 연결된 서버에서. SQL 서버에서 데이터를 조회하는 경우, 정확한 결과는 다시하게된다 예 :Entity Framework v4 - 연결된 저장 프로 시저 Select 문 - 연결된 쿼리 (Open Query) -1

SELECT * FROM OPENQUERY(SERVER, ''SELECT * FROM db.table WHERE field = ' + '''' + '''' + @var+ '''' + ''''')' 

지금은 데이터에 액세스 할 엔티티 프레임 워크의 V4를 사용하는 C#의 윈폼 응용 프로그램을 가지고 있고, 코드에서이 저장 프로 시저에 액세스하려면 .

나는 '데이터베이스에서 업데이트 모델'을 수행하고 저장 프로 시저를 추가 한 다음 함수 가져 오기 (예 : getData)를 추가하기로 결정했습니다. 내가 확인을 클릭이 시점에서

'The selected stored procedure returns no columns' 

다음 (다음과 같이) SP에 액세스 할 수있는 몇 가지 간단한 코드를 썼습니다 : 다음 '열 정보 가져 오기'를 클릭 한 후 발견, 나는 다음과 같은 메시지를받은

using(var context = new MyContext()) 
{ 
    var result = context.getData('paramdata'); 
} 

코드를 단계별로 실행할 때 결과는 '-1'로 설정됩니다. 일부 읽기를 한 후에 누군가가 NOCOUNT를 OFF로 설정하도록 제안했지만 저장 프로 시저에서 아무런 차이가 없었습니다.

SQL Server에서는 쿼리가 작동하지만 Entity Framework에서는 작동하지 않는 이유가 확실하지 않습니다.

이 방법을 사용할 수 있습니까? 사전에

감사합니다.

답변

2

OpenQuery를 사용하기 때문에 열 목록을 SQL 서버에 알 수 없습니다.

테이블 변수를 만들고 열기 쿼리 결과를 삽입 한 다음 테이블 변수에서 선택해보십시오. SQL Server에서 해당 쿼리를 작성할 때

declare @t table(ID int, value nvarchar(50)) 
insert @t (ID, value) 
select Id,Value FROM OPENQUERY(SERVER, 'SELECT * FROM db.table') 

select ID, Value from @t 
+0

이것은 훌륭하게 작동합니다!, 나는 테이블 변수를 생성하고 그것을 선택했습니다. 그런 다음 모든 데이터에 액세스하기 위해 복잡한 유형 함수 가져 오기를 만들었습니다. – user1097734

+0

코드 예제를 제공 할 수 있습니까? – TStu

+0

@Stu 위의 편집 참조 – podiluska

0

쿼리가 데이터를 반환하지 않으므로 행 정보가 반환되지 않습니다. 쿼리를 수정하고 실행중인 데이터베이스를 확인하십시오. 그리고 *를 선택하면 문제를 해결할 수 있습니다.

+0

는 내가 기대하는 데이터를 수신. 쿼리하는 연결된 서버는 MySQL을 사용합니다. – user1097734

0
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
DECLARE @Query nvarchar(max); 
DECLARE @LinkServer varchar(20); 
DECLARE @CatalogSch varchar(20); 

DECLARE @DIVISION_NO INT; 
DECLARE @BLOCK_NO INT; 
DECLARE @LOT_NO INT 

/* With this code I get the server and catalog (production or develpment environment)*/ 
EXEC [dbo].[usp_GetLinkServerAndSchema] 'ACTJO', @LinkServer out, @CatalogSch out; 

/* Declare the table */ 
declare @t table(Division_no int, block_no int, lot_no int) 

/* Build the query to get the three values */ 
SET @Query = 'SELECT @DIVISION_NO = [DIVISION_NO], @BLOCK_NO = [BLOCK_NO], @LOT_NO = [LOT_NO] FROM OPENQUERY ('[email protected]+','' 
      SELECT DIVISION_NO, BLOCK_NO, LOT_NO 
      FROM '[email protected]+'.[CSS_PREMISE] 
      WHERE ACCOUNT_NO = '+convert(varchar,@account)+''')' 

/* execute the query */ 
EXEC sp_executesql @Query, N'@DIVISION_NO INT output, @BLOCK_NO INT output, @LOT_NO INT output', @DIVISION_NO output, @BLOCK_NO output, @LOT_NO output; 

/* insert the values into the table */ 
insert @t (Division_no,block_no,lot_no) 
    select @DIVISION_NO, @BLOCK_NO, @LOT_NO; 

/* query the temporary table */ 
select Division_no,block_no,lot_no from @t