2016-10-23 8 views
-1

Я использую SQL Server 2012.Почему возникают ошибки при попытке запустить хранимую процедуру?

Мне нужно передать массив целых чисел в мою хранимую процедуру из Visual Studio. Мне нужно использовать переданный массив в пункте where.

Для этой цели я создал table valued parameter:

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 

Но я стараюсь, чтобы запустить хранимую процедуру и передачи значений (некоторые целые числа) в казнить окно процедуры , Я получаю эту ошибку:

Must pass parameter number 2 and subsequent parameters as '@name = value'. After the form '@name = value' has been used, all subsequent parameters must be passed in the form '@name = value'.

UPDATE:

Вот как я вызвать хранимую процедуру:

DECLARE @return_value int 

EXEC @return_value = [dbo].[SP_TEST_TLP] 
     @List = 1,6 

SELECT 'Return Value' = @return_value 

Любая идея, почему я получаю эту ошибку? Что я делаю не так?

+1

Если вы хотите, чтобы мы указывали, что вы делаете неправильно, отправьте код, который вы используете, чтобы выполнить proc. Кроме того, не используйте 'sp_' в качестве префикса имени хранимой процедуры. Это обозначает хранимую процедуру системы SQL Server. Не прилагайте TVP котировки. Вместо этого укажите подзапрос, например 'SELECT id FROM @ List'. –

+0

'Where Clients.Id IN ('@List')' не будет делать то, что вы хотите. Вы уже получили правильный синтаксис здесь http://stackoverflow.com/questions/40206849/why-i-get-error-when-i-try-to-create-stored-procedure –

+0

Можете ли вы получить код, который выполняет процедуру окна производит? Окно процедуры выполнения использует синтаксис @name = value для вызова SP. Если вы просто записываете числа в виде запятой (1, 2, 3), то, скорее всего, это будет интерпретироваться как '@List = 1, 2, 3', и это не то, что вы хотите. – infiniteRefactor

ответ

2

Табличные типы и параметры в TSQL немного различаются, чем вы задумали.

Табличные параметры - это в основном таблицы, а не массивы или списки. Вы не можете использовать синтаксис, разделенный запятыми, для указания нескольких значений.

Вы должны сделать это как

DECLARE @return_value int 
DECLARE @MyList AS dbo.IdArray 

INSERT INTO @MyList (Id) 
VALUES (1),(6) 

EXEC @return_value = [dbo].[SP_TEST_TLP] @List = @MyList 

SELECT 'Return Value' = @return_value 

Я думаю, вы не можете сделать это с Execute хранимая процедура интерфейс.

И в корпусе хранимой процедуры вы должны использовать @List, как если бы вы использовали любое имя таблицы. Конструкция вашего ... IN ('$List')... не будет работать. Вам нужно использовать соединение или подзапрос. Помните, @List - это таблица.

+0

thank you.D. У вас есть идеи, как я могу передать массив int из visual studio, чтобы заполнить параметр таблицы? – Michael

+0

@Michael, передайте параметр типа System.Data.SqlDbType.Structured. Значение может быть «DataTable», «DataRow []» или «IEnumerable ». DataTable, содержащий список целых чисел, вероятно, проще всего. –

 Смежные вопросы

  • Нет связанных вопросов^_^