8

मेरे पास 'StoreIDs' नामक तालिका-मानित पैरामीटर के साथ 'GetPrices' नामक SQL सर्वर 2008 में संग्रहीत प्रक्रिया है।संग्रहित प्रक्रिया में तालिका-मूल्यवान पैरामीटर और इकाई फ्रेमवर्क 4.0

CREATE TYPE integer_list_tbltype AS TABLE (n int) 

मैं अपने इकाई की रूपरेखा से सपा कॉल करना चाहते हैं:

इस प्रकार मैं इस TVP के लिए बनाई गई है। लेकिन जब मैं ईडीएम में संग्रहीत प्रक्रिया को जोड़ने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है:

फ़ंक्शन 'GetPrices' में पैरामीटर इंडेक्स 2 पर 'StoreIDs' पैरामीटर है जिसमें डेटा प्रकार 'टेबल प्रकार' है जो नहीं है समर्थित। समारोह को बाहर रखा गया था।

क्या कोई कामकाज है? कोई विचार?

फैबियो

उत्तर

0

आप पर this at microsoft connect

अद्यतन वोट करने के लिए चाहते हो सकता है: एमएस के लिए बंधन का उपयोग नहीं करता है किसी भी अधिक सुविधाएँ। वे केवल बग रिपोर्ट के लिए इसका इस्तेमाल करते हैं। ईएफ सुविधा के लिए वोट करने के लिए आपको EF User Voice साइट पर जाना होगा।

इस विशिष्ट issue on User Voice go here के लिए वोट देने के लिए।

1

चूंकि आप तालिका पैरामीटर का उपयोग नहीं कर सकते हैं, इसलिए एक CSV स्टिंग में गुजरने का प्रयास करें और संग्रहीत प्रक्रिया को आपके लिए पंक्तियों में विभाजित करें।

SQL सर्वर में स्ट्रिंग को विभाजित करने के कई तरीके हैं। यह लेख पक्ष और लगभग हर विधि के विपक्ष को शामिल किया गया:

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

आप एक विभाजन समारोह बनाना होगा। इस तरह एक विभाजन समारोह इस्तेमाल किया जा सकता है:

SELECT 
    * 
    FROM YourTable        y 
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value 

I prefer the number table approach to split a string in TSQL लेकिन वहाँ एसक्यूएल सर्वर में विभाजित करने के लिए तार, पिछले लिंक है, जो लाभ और प्रत्येक के विपक्ष बताते देखने के कई तरीके हैं।

नंबर तालिका विधि के लिए काम करने के लिए, तो आप इस एक समय तालिका सेटअप है, जो एक मेज Numbers कि से 1 से 10,000 पंक्तियां हैं पैदा करेगा क्या करने की जरूरत:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

एक बार नंबर मेज की स्थापना की है , इस विभाजन समारोह बनाने के लिए:

CREATE FUNCTION [dbo].[FN_ListToTable] 
(
    @SplitOn char(1)  --REQUIRED, the character to split the @List string on 
    ,@List  varchar(8000)--REQUIRED, the list to split apart 
) 
RETURNS TABLE 
AS 
RETURN 
( ---------------- 
    --SINGLE QUERY-- --this will not return empty rows 
    ---------------- 
    SELECT 
     ListValue 
     FROM (SELECT 
        LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue 
        FROM (
          SELECT @SplitOn + @List + @SplitOn AS List2 
         ) AS dt 
         INNER JOIN Numbers n ON n.Number < LEN(dt.List2) 
        WHERE SUBSTRING(List2, number, 1) = @SplitOn 
      ) dt2 
     WHERE ListValue IS NOT NULL AND ListValue!='' 
); 
GO 

अब आप आसानी से एक तालिका में एक सीएसवी स्ट्रिंग विभाजित कर सकते हैं और उस पर में शामिल होने या इसका इस्तेमाल लेकिन आप की जरूरत:

CREATE PROCEDURE YourProcedure 
(
    @CSV_Param varchar(1000) 
) 
AS 

--just an example of what you can do 
UPDATE t 
    SET Col1=... 
    FROM dbo.FN_ListToTable(',',@CSV_Param) dt 
     INNER JOIN TBL_USERS     t ON CAST(dt.value AS INT)=t.id 

GO 
1

आप अपने तालिका-मूल्यवान पैरामीटर बनाने और उपयोग करने के लिए ऑब्जेक्ट कॉन्टेक्स्ट.कनेक्शन प्रॉपर्टी का उपयोग use ADO.NET पर कर सकते हैं। यह स्वीकार्य नहीं हो सकता है, लेकिन यदि आप इस भयानक SQL Server 2008 सुविधा और ईएफ का उपयोग करना चाहते हैं, तो ऐसा लगता है कि आप केवल choise हैं।

फिर आप निम्न निम्न स्तर ADO.NET सामानों की देखभाल करने के लिए विधि के साथ आंशिक रूप से जेनरेट किए गए ऑब्जेक्ट संदर्भ को सीमित कर सकते हैं।इस तरह:

public partial class FriendsOnBoardEntities : ObjectContext 
{ 
    public IList<int> GetPrices(int n) 
    { 
     // 'low-level' ado.net stuff here. 
     // Use SqlParameters, SqlCommand and what not... 
    } 
} 
1

मैं मानता हूं कि एक सीएसवी स्टिंग में गुजरना इस मामले में सबसे अच्छा समाधान है। मैं सीटीई:

declare @separator char(1); 
set @separator = ','; 

;with baseCte as 
(select left(@ValueList, charindex(@separator, @ValueList) - 1) as Value, 
substring(@ValueList, charindex(@separator, @ValueList) + 1, len(@ValueList)) 
as rest 
union all 
select left(rest, charindex(@separator, rest) - 1) as Value, 
substring(rest, charindex(@separator, rest) + 1, len(rest)) from baseCte 
where len(rest) > 1 
) 
select Value from baseCte 
OPTION (MAXRECURSION 0); 
का उपयोग करके सीएसवी स्ट्रिंग को विभाजित करने के लिए सरल तरीका प्रस्तावित करना चाहता हूं।