У меня есть хранимая процедура в SQL Server 2008 под названием 'GetPrices' с Табличным Параметром под названием 'StoreIDs'.
Это - тип, который я создал для этого TVP:
CREATE TYPE integer_list_tbltype AS TABLE (n int)
Я хотел бы назвать SP от своей Платформы Объекта. Но когда я пытаюсь добавить Хранимую процедуру к EDM, я получаю следующую ошибку:
Функциональный 'GetPrices' имеет параметр 'StoreIDs' в индексе 2 параметра, который имеет тип данных 'тип таблицы', который не поддерживается. Функция была исключена.
Есть ли какое-либо обходное решение это? Какие-либо мысли?
Fabio
Поскольку вы не можете использовать параметр таблицы, попробуйте передать CSV-файл и попросите хранимую процедуру разделить его на строки для вас.
Существует множество способов разделения строки в SQL Server. В этой статье рассматриваются плюсы и минусы практически каждого метода:
Вам нужно создать функцию разделения. Вот как можно использовать функцию разделения:
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
Вы можете проголосовать за это на microsoft connect.
Обновление: MS больше не использует Connect для функций. Они используют его только для отчетов об ошибках. Чтобы проголосовать за функцию EF, вам необходимо перейти на сайт EF User Voice .
Чтобы проголосовать за эту конкретную проблему в User Voice, перейдите сюда .