8

我想给一个标识符数组作为存储过程的参数。

存储过程如下所示:

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 不兼容

4

2 回答 2

15

我找到了答案:是表格类型参数的顺序导致了错误!

表类型参数必须是存储过程参数中的第一个并且也是传递给存储过程调用的参数中的第一个!

存储过程:

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 错误还是我错过了什么?

于 2013-09-24T08:50:23.263 回答
3
  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 - 表类型参数的位置无关紧要,您必须在传递数据时确保顺序,您可以检查上面的代码在表类型参数最后的位置是否正常工作。

于 2016-09-22T16:32:15.140 回答