Табличный параметр в хранимой процедуре и платформе объекта 4.0

У меня есть хранимая процедура в SQL Server 2008 под названием 'GetPrices' с Табличным Параметром под названием 'StoreIDs'.

Это - тип, который я создал для этого TVP:

CREATE TYPE integer_list_tbltype AS TABLE (n int)

Я хотел бы назвать SP от своей Платформы Объекта. Но когда я пытаюсь добавить Хранимую процедуру к EDM, я получаю следующую ошибку:

Функциональный 'GetPrices' имеет параметр 'StoreIDs' в индексе 2 параметра, который имеет тип данных 'тип таблицы', который не поддерживается. Функция была исключена.

Есть ли какое-либо обходное решение это? Какие-либо мысли?

Fabio

8
задан KM. 14 May 2010 в 20:37
поделиться

2 ответа

Поскольку вы не можете использовать параметр таблицы, попробуйте передать CSV-файл и попросите хранимую процедуру разделить его на строки для вас.

Существует множество способов разделения строки в SQL Server. В этой статье рассматриваются плюсы и минусы практически каждого метода:

"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

Я предпочитаю подход таблицы чисел для разделения строки в TSQL, но существует множество способов разделения строк в SQL Server, см. предыдущую ссылку, где объясняются плюсы и минусы каждого из них.

Чтобы метод таблицы Numbers работал, вам нужно выполнить однократную настройку таблицы, которая создаст таблицу 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)

После того, как таблица 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
1
ответ дан 6 December 2019 в 00:54
поделиться

Вы можете проголосовать за это на microsoft connect.

Обновление: MS больше не использует Connect для функций. Они используют его только для отчетов об ошибках. Чтобы проголосовать за функцию EF, вам необходимо перейти на сайт EF User Voice .

Чтобы проголосовать за эту конкретную проблему в User Voice, перейдите сюда .

0
ответ дан 6 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: