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