2012-02-23 114 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事件探查器顯示我,它會生成以下:

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()); 

而對於PROC:

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的代碼嗎? – 2012-02-23 17:26:53

+0

以及顯示你的代碼,調用存儲過程請... – MethodMan 2012-02-23 17:27:43

+1

你也可以顯示應用程序代碼?您是否將命令類型定義爲StoredProcedure? sp_executesql讓我相信你沒有。 – 2012-02-23 17:32:06

回答

1

我懷疑你正在sp_executesql,因爲你已經宣佈你的CommandType爲比StoredProcedure以外的東西。你在Profiler中看到的看起來不正確。

+0

爲此,我沒有明確地設置它,所以默認的'CommandType'是'Text',在這種情況下使用'sp_executesql'。側邊欄會是爲什麼'sp_executesql'對我的'StoreTableType'不滿意,這樣它就會忽略它?但幸好我不需要那個答案來繼續提高生產力。 :-) – 2012-02-23 18:51:49

+0

看起來像一些圖層中的錯誤。除了'sp_executesql'不能以某種方式正確傳遞數據之外,我沒有更好的答案。我將嘗試爲此編寫一個repro並提交一個錯誤。如果錯誤的'CommandType'意味着數據沒有正確傳遞,應該有一個例外,而不是沉默。 – 2012-02-23 18:54:38