Mich_90 Ответов: 1

Почему я получаю -1 из хранимой процедуры?


Я использую SQL Server 2012 и Entity Framework6.

Я создал параметр с табличным значением:
CREATE TYPE IdArray AS TABLE 
    (
         Id int
    );

А вот моя хранимая процедура:

ALTER PROCEDURE [dbo].[SP_TEST_TLP]
        @List dbo.IdArray READONLY 
    AS 
    BEGIN
        SET NOCOUNT ON;
    
        SELECT * 
        FROM Clients 
        WHERE Clients.Id IN ( '@List' )
    END


Из Visual Studio я вызываю хранимую процедуру и передаю параметры в хранимую процедуру.

Я делаю это таким образом:

Создать DataTable:

var myDataTable = new DataTable();
     myDataTable.Columns.Add("Id", typeof(int));

     myDataTable.Rows.Add(1);
     myDataTable.Rows.Add(3);
     myDataTable.Rows.Add(6);


Создание " SqlParameter` из DataTable:
SqlParameter parameter = new SqlParameter();
     parameter.ParameterName = "@List";
     parameter.SqlDbType = System.Data.SqlDbType.Structured;
     parameter.TypeName = "dbo.IdArray";
     parameter.Value = myDataTable;


Огонь хранимых процедур и передача параметров:
var data = _context.Database.ExecuteSqlCommand("SP_TEST_TLP @List", parameter);


Проблема в том, что` ExecuteSqlCommand ' возвращает -1.

Почему ExecuteSqlCommand` возвращает -1 в то время как я ожидаю строк из базы данных?

Что я уже пробовал:

Я попробовал все вышесказанное, но это не сработало!

1 Ответов

Рейтинг:
2

Wendelius

Список in не работает таким образом. Вы не можете передать список в одном параметре и ожидать, что он будет возвращать строки.

Правильный синтаксис для IN-это

columnname IN (value1, value2, value3, ...)

Для того чтобы IN работал, вам нужно интерпретировать список в хранимой процедуре. Есть довольно много статей об этом, например:
- Проходя через запятую параметр для хранимой процедуры[^]
- Передача параметра, разделенного запятыми, в хранимую процедуру[^]
- Построение динамического SQL в хранимой процедуре[^]