我正在尝试在存储过程中使用用户定义的表,但是在运行过程时却出现错误消息
"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 ..."
请帮帮我。任何建议,感激不尽!
答案 0 :(得分:0)
您需要传递一个存在的参数值。如果您想从select
myUserTable
,而不是sample
传递。另外,您需要传递FirstName
类型的varchar(max)
。您需要确保通过的所有内容都与此类型兼容。最后,如果my.Id
和ut.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'