8

SQL Server 2008 に、「StoreIDs」というテーブル値パラメーターを持つ「GetPrices」というストアド プロシージャがあります。

これは、この TVP 用に作成したタイプです。

CREATE TYPE integer_list_tbltype AS TABLE (n int)

Entity Framework から SP を呼び出したいと思います。しかし、ストアド プロシージャを EDM に追加しようとすると、次のエラーが発生します。

関数 'GetPrices' には、パラメーター インデックス 2 に、サポートされていないデータ型 'table type' を持つパラメーター 'StoreIDs' があります。関数は除外されました。

これの回避策はありますか?何かご意見は?

ファビオ

4

4 に答える 4

2

この場合、CSV 文字列を渡すことが最善の解決策であることに同意します。CTEを使用して、テーブルや関数を作成せずにcsv文字列を分割する簡単な方法を提案したいと思います:

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);
于 2012-11-20T16:21:35.380 に答える
1

テーブル パラメーターは使用できないため、CSV 文字列を渡して、ストアド プロシージャで行に分割してみてください。

SQL Server で文字列を分割する方法は多数あります。この記事では、ほぼすべての方法の長所と短所について説明します。

Erland Sommarskog による「SQL Server 2005 以降の配列とリスト、テーブル値パラメーターがそれをカットしない場合」

分割関数を作成する必要があります。これは、分割機能を使用する方法です。

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

私は TSQL で文字列を分割する数値テーブル アプローチを好みますが、SQL Server で文字列を分割する方法は多数あります。それぞれの長所と短所を説明している前のリンクを参照してください。

NumbersNumbers Table メソッドを機能させるには、1 から 10,000 までの行を含むテーブルを作成する、この 1 回限りのテーブル設定を行う必要があります。

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)

Numbers テーブルを設定したら、次の分割関数を作成します。

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 

CSV 文字列を簡単にテーブルに分割して結合したり、必要に応じて使用したりできるようになりました。

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
于 2010-05-14T20:34:57.343 に答える
1

ObjectContext.Connection プロパティを使用して、ADO.NETを使用してテーブル値パラメーターを作成および使用できます。これは受け入れられないかもしれませんが、この素晴らしい SQL Server 2008 機能と EF を使用したい場合は、これを選択するしかないようです。

次に、メソッドを使用して部分的に生成されたオブジェクト コンテキストを拡張し、すべての低レベルの 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...
    }
}
于 2011-11-07T19:11:09.117 に答える
0

microsoft connect でこれに投票することをお勧めします。

更新: MS は Connect for features を使用しなくなりました。彼らはそれをバグレポートにのみ使用します。EF 機能に投票するには、 EF User Voiceサイトにアクセスする必要があります。

User Voiceでこの特定の問題に投票するには、ここにアクセスしてください。

于 2010-05-14T20:27:47.217 に答える