Параметр типа таблицы в хранимой процедуре вызывает ошибку столкновения типов операндов
Я хочу дать массив идентификаторов в качестве аргумента хранимой процедуре.
Хранимая процедура выглядит следующим образом:
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 ответа:
Я нашел ответ : это был порядок параметра типа таблицы, который вызвал ошибку !
Параметр 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 ENDSQL SERVER 2012-расположение параметра table type не имеет значения, вы должны убедиться, что последовательность при передаче данных, вы можете проверить выше код, который работает нормально, где параметр table type находится в конце.