Проблемы с типом таблицы в SQL Server 2008 - PullRequest
2 голосов
/ 23 февраля 2012

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

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',@StoreGUIDs=@p3

Однако, когда я запускаю это, я получаю:

enter image description here

Группировка по запросу в процедуре такая же, как и в 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]

1 Ответ

1 голос
/ 23 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...