1

当在任何地方绝对没有使用 int 时,我会收到此错误。

我有这个存储过程

 ALTER procedure [dbo].[usp_GetFileGuid] @fileType varchar(25)
 as 
 select [id] from fileTypes where dirId = @fileType

这里 id 是 fileTypes 表中的唯一标识符

当我执行以下

 declare @fileGuid uniqueidentifier
 exec @fileGuid = usp_GetFileGuid 'accounts'
 print @fileGuid

我收到以下错误

 (1 row(s) affected)
 Msg 206, Level 16, State 2, Procedure usp_GetFileGuid, Line 0
 Operand type clash: int is incompatible with uniqueidentifier

将存储过程的输出分配给局部变量的语法有什么问题吗?谢谢你。

4

3 回答 3

4

您正在使用EXEC @fileGuid = procedure用于检索返回值而不是结果集的语法。返回值仅限于INT并且只能用于返回状态/错误代码,而不是数据。

你想要做的是使用一个OUTPUT参数:

ALTER procedure [dbo].[usp_GetFileGuid] 
  @fileType varchar(25),
  @id UNIQUEIDENTIFIER OUTPUT
AS
BEGIN
  SET NOCOUNT ON;
  SELECT @id = [id] from dbo.fileTypes where dirId = @fileType;
  -- if the procedure *also* needs to return this as a resultset:
  SELECT [id] = @id;
END
GO

然后使用:

declare @fileGuid uniqueidentifier;
exec dbo.usp_GetFileGuid @fileType = 'accounts', @id = @fileGuid OUTPUT;
print @fileGuid;
于 2013-08-27T17:29:28.920 回答
1

返回的值是一个 int,因为它是执行的状态

CREATE PROCEDURE (Transact-SQL)

将状态值返回给调用过程或批处理以指示成功或失败(以及失败的原因)。

您正在寻找输出参数。

输出 | 输出

表示参数为输出参数。使用 OUTPUT 参数将值返回给过程的调用者。text、ntext 和 image 参数不能用作 OUTPUT 参数,除非该过程是 CLR 过程。输出参数可以是游标占位符,除非过程是 CLR 过程。不能将表值数据类型指定为过程的 OUTPUT 参数。

于 2013-08-27T17:31:18.393 回答
1
 create procedure [dbo].[usp_GetFileGuid] @fileType varchar(25),@uuid uniqueidentifier output
 as 
 select @uuid=[id] from fileTypes where dirId = @fileType 

 declare @fileGuid uniqueidentifier
 exec usp_GetFileGuid 'accounts',@fileGuid output
 print @fileGuid
于 2013-08-27T17:32:40.330 回答