Sql server 为什么这个简单过程的输出会改变数据类型?
在测试procs的输出值时,为什么最终的Sql server 为什么这个简单过程的输出会改变数据类型?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,在测试procs的输出值时,为什么最终的选择@TestValOut返回0,而不是null或空字符串 我知道正确的方法是使用OUTPUT参数,所以问题实际上变成了:为什么执行时@TestValOut的设置值的数据类型是整数? 存储过程中的返回值始终是整数,事实上,您只能使用带有返回值的整数。事实上,您看到的0意味着过程执行正确,这是SQL Server返回的返回值,告诉您过程执行的结果是什么 为了好玩,在程序中做一个选择1/0,你会看到它不再是0 看这里 下面是这个答案的例子 CREATE PR
选择@TestValOut
返回0
,而不是null
或空字符串
我知道正确的方法是使用OUTPUT
参数,所以问题实际上变成了:为什么执行时@TestValOut
的设置值的数据类型是整数?
存储过程中的返回值始终是整数,事实上,您只能使用带有返回值的整数。事实上,您看到的0意味着过程执行正确,这是SQL Server返回的返回值,告诉您过程执行的结果是什么 为了好玩,在程序中做一个
选择1/0
,你会看到它不再是0
看这里
下面是这个答案的例子
CREATE PROC pr_test AS
SELECT 1/0
RETURN 0
GO
现在运行它
DECLARE @i INT
exec @i = pr_test
SELECT @i -- will be 0
DROP PROC pr_test
现在让我们在不使用return语句的情况下再做一次
CREATE PROC pr_test2 AS
SELECT 1/0
GO
DECLARE @i INT
exec @i = pr_test2
SELECT @i -- will be - 6
最好使用
输出参数
传回状态和/或消息存储过程中的返回值始终是整数,事实上,您只能使用带有返回值的整数。事实上,您看到的0意味着过程执行正确,这是SQL Server返回的返回值,告诉您过程执行的结果是什么
为了好玩,在程序中做一个选择1/0
,你会看到它不再是0
看这里
下面是这个答案的例子
CREATE PROC pr_test AS
SELECT 1/0
RETURN 0
GO
现在运行它
DECLARE @i INT
exec @i = pr_test
SELECT @i -- will be 0
DROP PROC pr_test
现在让我们在不使用return语句的情况下再做一次
CREATE PROC pr_test2 AS
SELECT 1/0
GO
DECLARE @i INT
exec @i = pr_test2
SELECT @i -- will be - 6
最好使用
输出参数
传回状态和/或消息@TestValOut被分配由如下“返回”返回的值:
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN --defaults to zero, this is the value
GO
或
您的存储过程实际上什么都不做:没有结果集。要看到区别
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
select * from sys.objects
RETURN 42 --random value
GO
DECLARE @rtn int
EXEC @rtn = Custom.test
--you have the output of sys.objects now
--and the scalar RETURN value
SELECT @rtn
@TestValOut被分配了一个“RETURN”返回的值,如下所示:
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN --defaults to zero, this is the value
GO
或
您的存储过程实际上什么都不做:没有结果集。要看到区别
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
select * from sys.objects
RETURN 42 --random value
GO
DECLARE @rtn int
EXEC @rtn = Custom.test
--you have the output of sys.objects now
--and the scalar RETURN value
SELECT @rtn
您需要明确说明要返回的值。默认值为0
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN 0
GO
您需要明确说明要返回的值。默认值为0
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1
)
As
Declare @TestValIn varchar(max)
select @TestValIn='asdf'
RETURN 0
GO
我想你要做的是使用一个输出参数,应该这样做
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1,
@TestValOut varchar(max) OUTPUT
)
As
select @TestValOut='asdf'
GO
BEGIN TRAN
Declare @TestValOut varchar(max)
Exec Custom.test @CurrentUserID=1, @TestValOut OUTPUT
select @TestValOut
ROLLBACK
我想你要做的是使用一个输出参数,应该这样做
CREATE PROCEDURE Custom.test (
@CurrentUserID INT = 1,
@TestValOut varchar(max) OUTPUT
)
As
select @TestValOut='asdf'
GO
BEGIN TRAN
Declare @TestValOut varchar(max)
Exec Custom.test @CurrentUserID=1, @TestValOut OUTPUT
select @TestValOut
ROLLBACK
胡说八道,
@TestValOut
获取的是返回值,而不是结果set@ScottV:错了@TestValOut被分配了RETURN的值。存储过程中没有resultset RenonSense,@TestValOut
获取的是返回值,而不是结果set@ScottV:错了@TestValOut被分配了RETURN的值。存储过程中没有结果集。我们将发出警告:无法返回null。谢谢您让我知道。更新为返回0!将给出一个警告:不能返回。谢谢你让我知道。更新为返回0!是的,这是真的。然而,这个问题承认这是事实——但寻找(n隐式)回报的理由。是的,这是真的。然而,这个问题承认这是事实——但寻找(n隐式)回报的理由。