Параметр типа таблицы в хранимой процедуре вызывает ошибку столкновения типов операндов


Я хочу дать массив идентификаторов в качестве аргумента хранимой процедуре.

Хранимая процедура выглядит следующим образом:

ALTER PROCEDURE [dbo].[SearchPerson]
    @personType INT = NULL,
    @city NVARCHAR(64) = NULL,
    @siteIds IntegerList READONLY,
    -- some other params...
AS
    SELECT
        -- some fields...
    FROM dbo.PersonView AS pv
    WHERE
    (
        (@personType IS NULL OR pv.PersonType = @personType) AND
        (@city IS NULL OR pv.City LIKE '%' + @city + '%') AND
        (pv.SiteId in (SELECT si.Value FROM @siteIds AS si)) AND
        -- some other params filter...
    )

Тип таблицы пользователя выглядит следующим образом:

CREATE TYPE [dbo].[IntegerList] AS TABLE(
    [Value] [int] NULL
)

Когда я вызываю хранимую процедуру из скрипта в SSMS (первоначально у меня была та же проблема, вызывая ее из кода .NET):

DECLARE @siteIds AS IntegerList,
@personType AS INT = 1
INSERT INTO @siteIds VALUES (1)
EXEC [dbo].[SearchPerson] @personType, @siteIds

Я получил ошибку:

Столкновение типов операндов: int несовместим с IntegerList

2 6

2 ответа:

Я нашел ответ : это был порядок параметра типа таблицы, который вызвал ошибку !

Параметр table type должен быть первым в параметрах хранимой процедуры, а также в аргументах, передаваемых вызову хранимой процедуры !

Хранимая процедура:

ALTER PROCEDURE [dbo].[SearchPerson]
    @siteIds IntegerList READONLY, -- THIS PARAMETER HAS TO BE THE FIRST !
    @personType INT = NULL,
    @city NVARCHAR(64) = NULL,
    -- some other params...
AS
    SELECT
        -- some fields...
    FROM dbo.PersonView AS pv
    WHERE
    (
        (@personType IS NULL OR pv.PersonType = @personType) AND
        (@city IS NULL OR pv.City LIKE '%' + @city + '%') AND
        (pv.SiteId in (SELECT si.Value FROM @siteIds AS si)) AND
        -- some other params filter...
    )

И вызов:

DECLARE @siteIds AS IntegerList,
@personType AS INT = 1
INSERT INTO @siteIds VALUES (1)
EXEC [dbo].[SearchPerson] @siteIds, @personType -- PUT @siteIds FIRST !

Ошибка sql server или я что-то упустил ?

  DECLARE @ErrMsg varchar(1000)
  DECLARE @ServiceDates ServiceDatesType

  INSERT @ServiceDates (indexId,unitOfDay,dayOfMonth,dateOfMonth)
  VALUES 
  (0,1,11,'9/11/2016 12:00:00 AM'),
  (1,1,12,'9/12/2016 12:00:00 AM'),
  (2,1,13,'9/13/2016 12:00:00 AM')   

EXEC [usp_SaveValidate] 427,4,12,9,2016,@ErrMsg output,@ServiceDates  
PRINT @ErrMsg
*/

ALTER PROCEDURE [dbo].[usp_SaveValidate] (      
     @EpisodeNo INT 
    ,@ProviderId INT
    ,@ServiceId INT 
    ,@Month INT 
    ,@Year INT          
    ,@ErrorMessage VARCHAR(1000) OUTPUT 
    ,@ServiceDates ServiceDatesType ReadOnly
    )
AS
BEGIN
 -- Code Here
END

SQL SERVER 2012-расположение параметра table type не имеет значения, вы должны убедиться, что последовательность при передаче данных, вы можете проверить выше код, который работает нормально, где параметр table type находится в конце.