在sql中使用用户定义的表类型时出错->操作数类型冲突:varchar与“用户定义的表类型”不兼容

时间:2019-12-22 11:03:58

标签: sql sql-server

我正在尝试在存储过程中使用用户定义的表,但是在运行过程时却出现错误消息

 "Operand type clash: varchar is incompatible with ..." 

我定义了一个用户定义的表格,如下所示:

CREATE TYPE [myUserTable] AS TABLE(
    [Id] [nvarchar](10) NOT NULL)

存储过程:

Create PROCEDURE FETCHUSER
(@USERS [myUserTable] readonly,
   @Firstname varchar(max))
select * from UserTable as ut, @USERS as mt where mt.Id = ut.Id

在执行时,我提供了以下输入参数:

@USERS = 'Sample'

但是出现错误

"Operand type clash: varchar is incompatible with ..." 

请帮帮我。任何建议,感激不尽!

3 个答案:

答案 0 :(得分:0)

您需要传递一个存在的参数值。如果您想从select myUserTable,而不是sample传递。另外,您需要传递FirstName类型的varchar(max)。您需要确保通过的所有内容都与此类型兼容。最后,如果my.Idut.Id是不兼容的类型,那么为了进行比较,您将需要将其中一个转换为另一个类型。

答案 1 :(得分:0)

似乎您将@USERS变量声明为varchar,而预期的存储过程参数类型为myUserTable。要传递表值参数值,您需要声明一个表类型的变量,在表变量中插入行,然后调用proc。

以下是使用现代ISO SQL连接语法基于问题代码的重构示例。不知道在您的实际代码中如何使用@FirstName,但我将其保留在这里。

CREATE PROCEDURE FETCHUSER
    @USERS [myUserTable] readonly
   ,@Firstname varchar(max)
AS
SELECT *
FROM UserTable AS ut
JOIN @USERS AS mt ON mt.Id = ut.Id;
GO

DECLARE @myUserTable [myUserTable];
INSERT INTO @myUserTable(ID) VALUES(N'Sample');

EXEC FETCHUSER @USERS = @myUserTable, @FirstName = '';
GO

答案 2 :(得分:0)

我认为以下代码可以为您提供帮助

CREATE TYPE [dbo].[myUserTable] AS TABLE([Id] [nvarchar](10) NOT NULL);

CREATE PROCEDURE [dbo].FETCHUSER
@USERS [myUserTable] READONLY,
@Firstname VARCHAR(MAX)
AS
BEGIN
    SELECT *
    FROM   UserTable    AS ut
           JOIN @USERS  AS mt
                ON  mt.Id = ut.Id;
END
GO


DECLARE @users [myUserTable]

INSERT INTO @users
VALUES
   (
    '1'
   ) ,
   (
    '2'
   ) 

EXEC FETCHUSER @users,
     'yourFirstName'