Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么这个简单过程的输出会改变数据类型?_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 为什么这个简单过程的输出会改变数据类型?

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

在测试procs的输出值时,为什么最终的
选择@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隐式)回报的理由。