2012-02-23 2 views
2

При работе над передачей типа таблицы вокруг меня возникает странная проблема, на которую я надеюсь, что-то простое, с чем я могу получить помощь. Мой тип таблицы выглядит следующим образом:Проблемы с типом таблицы в SQL Server 2008

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

У меня есть хранимая процедура, что я передаю это к тому, что содержит группу по запросу, чтобы показать некоторые итоговые данные по рынку. Но вот где интересно ... если я запустил запрос в SQLEM, он работает, но если он вызывает хранимый процесс, он ничего не возвращает. Вот что я бегу, чтобы получить результат:

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 Profiler показывает мне, что он генерирует следующее :

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

Я подозреваю, что вы получаете sp_executesql, потому что вы объявили ваш CommandType как нечто иное, чем StoredProcedure. То, что вы видите в Profiler, кажется неправильным.

+0

Только за последние два цента на этом я явно не задал его, поэтому по умолчанию 'CommandType' был' Text', который в этом случае использовал 'sp_executesql'. Боковая панель была бы потому, что 'sp_executesql' недоволен моим« StoreTableType »таким образом, что он просто игнорирует его? Но, к счастью, мне не нужен ответ на этот вопрос, чтобы продолжать быть продуктивным. :-) –

+0

Похоже на ошибку в некотором слое. У меня нет лучшего ответа для вас, кроме того, что 'sp_executesql' не передает данные должным образом. Я попытаюсь обработать ревью для этого и записать ошибку. Если неправильный 'CommandType' означает, что данные не переданы правильно, должно быть исключение, а не молчание. –

Смежные вопросы