2012-02-23 3 views
2

테이블 형식을 전달하는 작업에서 도움이 될만한 간단한 이상한 문제가 발생했습니다. 내 테이블 유형은 다음과 같습니다SQL Server 2008의 테이블 형식에 대한 문제

CREATE TYPE [dbo].[StoreTableType] AS TABLE(
[StoreGUID] [uniqueidentifier] NULL 
) 

나는 내가 그에게이 전달 proc 디렉토리에 저장되어 시장에 의해 약간의 합계를 표시하는 쿼리 그룹이 포함되어있다. 하지만 여기서 흥미로운 부분이 있습니다 ... SQLEM에서 쿼리를 실행하면 작동하지만 저장된 proc를 호출하면 아무 것도 반환하지 않습니다. 여기에 내가 결과를 얻기 위해 실행 내용은 다음과 같습니다

declare @p3 dbo.StoreTableType 
insert into @p3 values('121A267F-F994-4B01-8318-9E307AF9415B') 
insert into @p3 values('B2BB61CE-5ED8-4C91-ADB7-DA903B6D506A') 
insert into @p3 values('5818BA65-A1B5-432E-BF76-68EF51635A39') 

select * from survey where storeguid in (select StoreGUID from @p3) 

select m.[Name] as Market, count(svy.SurveyGUID) as Total 
from survey svy inner join store s on svy.StoreGUID = s.StoreGUID 
inner join Market m on s.MarketID = m.MarketID 
where s.StoreGUID in (select StoreGUID from @p3) 
group by m.[Name] 

이 저를 줄 것이다 : 나는 내 코드에서 문을 실행하면

enter image description here

이제

, SQL 프로파일 러가 나를 보여주고는 다음을 생성하는 :이 프로그램을 실행할 때

declare @p3 dbo.StoreTableType 
insert into @p3 values('121A267F-F994-4B01-8318-9E307AF9415B') 
insert into @p3 values('B2BB61CE-5ED8-4C91-ADB7-DA903B6D506A') 
insert into @p3 values('5818BA65-A1B5-432E-BF76-68EF51635A39') 

exec sp_executesql N'snus_MarketTotals',N'@StoreGUIDs [StoreTableType]  READONLY',@[email protected] 

그러나, 내가 얻을 :

enter image description here

proc의 쿼리 별 그룹은 SQLEM에서 테스트 한 그룹과 동일합니다. 누구든지 아이디어가 있습니까? 나는 테이블 타입에 보석금을 쓸 준비가되었다. .. 그러나 내가 단지 무엇인가 멀리 바라보고 있는지 알고 싶었다.

업데이트 : 다음은 전화를 거는 코드입니다.

 // EF <hates> table type parameters... so... gonna put some SQL in here. 
     SqlConnection conn = new SqlConnection(connectionString); 
     DataSet ds = new DataSet(datasetName); 

     using (SqlCommand cmd = new SqlCommand(spName, conn)) 
     { 
      SqlParameter param = new SqlParameter("@StoreGUIDs", SqlDbType.Structured); 
      param.Value = storeGuids; 
      param.TypeName = "StoreTableType"; 
      cmd.Parameters.Add(param); 

      SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
      adapter.Fill(ds); 

     } 

     // get some xml 
     return(ds.GetXml()); 

그리고 시저에 대한

:

CREATE PROCEDURE [dbo].[MarketTotals] 
(
    @StoreGUIDs StoreTableType readonly 
) 
AS 
begin 

-- market totals 
select m.[Name] as Market, count(svy.SurveyGUID) as Total 
from survey svy inner join store s on svy.StoreGUID = s.StoreGUID 
    inner join Market m on s.MarketID = m.MarketID 
where s.StoreGUID in (select StoreGUID from @StoreGUIDs) 
group by m.[Name] 
+0

SP 코드를 게시 할 수 있습니까? –

+0

저장 프로 시저를 호출하는 코드를 잘 보여주십시오 ... – MethodMan

+1

응용 프로그램 코드도 표시 할 수 있습니까? 명령 유형을 StoredProcedure로 정의 했습니까? sp_executesql은 당신이하지 않았다고 믿게합니다. –

답변

1

난 당신이 StoredProcedure 아닌 다른 같은 CommandType 선언했기 때문에 당신이 sp_executesql을 받고 있다고 생각한다. 프로파일 러에서보고있는 내용이 옳지 않은 것처럼 보입니다.

+0

이것에 대한 마지막 2 센트의 경우, 명시 적으로 설정하지 않았으므로 기본'CommandType'은'Text'이었습니다.이 경우에는'sp_executesql'을 사용했습니다. 사이드 바는 왜'sp_executesql'이 내 'StoreTableType'에 불만스러워서 무시할 수 있을까요? 그러나 고맙게도 저는 생산성을 유지하기 위해 그 해답을 필요로하지 않습니다. :-) –

+0

일부 레이어의 버그처럼 보입니다. 나는'sp_executesql'가 데이터를 어떻게 든 적절하게 전달하지 않는다는 점을 제외하고는 더 나은 대답을 갖고 있지 않습니다. 이 문제를 해결하고 버그를 제기하려고 노력할 것입니다. 잘못된 'CommandType'이 데이터가 올바르게 전달되지 않는다면, 침묵이 아닌 예외가 있어야합니다. –