Sql server 存储过程中怎么将变量赋值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sql server 存储过程中怎么将变量赋值?相关的知识,希望对你有一定的参考价值。

参考技术A /*
Sql server 存储过程中怎么将变量赋值
*/

--SQL赋值语句
DECLARE @test1 INT
SELECT @test1 = 111
SET @test1 = 222

--SQL函数赋值,假定count()是自定义函数
DECLARE @test2 INT
SELECT @test2 = COUNT(*) FROM sys.sysobjects

--SQL存储过程赋值,直接传参处理(类似C语言中的指针吗)
IF OBJECT_ID('sp_test') IS NOT NULL DROP PROCEDURE sp_test
GO
CREATE PROCEDURE sp_test(@test INT OUTPUT)
AS
BEGIN
SELECT @test = 999
END
GO

DECLARE @test3 INT
EXEC sp_test @test3 OUTPUT
SELECT @test3

DROP PROCEDURE sp_test
GO

如何使用 SQL Server 将存储过程的结果存储在变量中

【中文标题】如何使用 SQL Server 将存储过程的结果存储在变量中【英文标题】:How to store result of stored procedure in a variable using SQL Server 【发布时间】:2015-07-15 07:08:50 【问题描述】:

我正在处理 SQL 查询,我必须将存储过程的结果存储到字符串类型变量中。有一个名为 SP_CheckAgentProperty 的存储过程返回一个字符串类型的值“y”或“N”或“NP”。

我将一个整数值传递给存储过程。我想将此输出存储在任何字符串变量中。为此,我使用了这个 SQL 查询:

我的存储过程是:

CREATE Procedure [dbo].[SP_CheckAgentProperty] --12
(
    @ID bigint =null
)      
As
BEGIN
------Calculating total Ads Post allowed of any specific package of any user-----
DECLARE @Ad int=(SELECT tblPackage.Ads FROM tblPayment_Details INNER JOIN tblPayments ON tblPayments.ID = 
            tblPayment_Details.Payment_ID INNER JOIN tblPackage ON tblPayments.Package_ID = tblPackage.ID
            WHERE (tblPayment_Details.Payment_ID =(SELECT MAX(ID) AS d  FROM tblPayments AS tblPayments_1 WHERE (User_ID = @ID))))
            print @Ad
------Calculating the date when the user makes the last payment------
DECLARE @St DATE=(SELECT tblPayment_Details.Date FROM tblPayment_Details INNER JOIN tblPayments ON 
            tblPayments.ID = tblPayment_Details.Payment_ID INNER JOIN tblPackage ON tblPayments.Package_ID = tblPackage.ID
            WHERE (tblPayment_Details.Payment_ID =(SELECT MAX(ID) AS d  FROM tblPayments AS tblPayments_1 WHERE (User_ID = @ID))))
            print @St
------Calculating the validity of specific package taken by any user-----
DECLARE @LT int=(SELECT tblPackage.Validity FROM tblPayment_Details INNER JOIN tblPayments ON tblPayments.ID = 
            tblPayment_Details.Payment_ID INNER JOIN tblPackage ON tblPayments.Package_ID = tblPackage.ID
            WHERE (tblPayment_Details.Payment_ID =(SELECT MAX(ID) AS d  FROM tblPayments AS tblPayments_1 WHERE (User_ID = @ID))))
            print @LT
print dateadd(DAY,@LT,@St)
-------Calculating the Remaining days of package taken by the user
DECLARE @NoOfDays int=(select DATEDIFF(DAY,GETDATE(),dateadd(DAY,@LT,@St)))
print @NoOfDays 
-------Calculating if the user makes does not any payment in history------
DECLARE @SS int=(ISNULL(DATEDIFF(DAY, GETDATE(), @St), 0))
IF(@SS='0')
BEGIN
    select 'NP' as Message
END
ELSE
BEGIN
    if(@NoOfDays<=0)
    BEGIN
        --select 'This User Does Not Make a Payment.' as Message
        select 'MP' as Message
    END
    ELSE
    BEGIN
        DECLARE @TOT int=(select count(*) from tblProperty where tblProperty.Date between @St and dateadd(DAY,@LT,@St)) 
        --group by tblProperty.ID
        --select count(*) from tblProperty where tblProperty.Date between '2015-07-04' and dateadd(DAY,20,'2015-07-04')
        IF(@TOT<@Ad)
        BEGIN
            select 'y' as Message
        END
        ELSE
        BEGIN
            select 'N' as Message
        END
    END
END
END

我正在使用上面的存储过程是这样的:

declare @ss varchar(10)

exec @ss = SP_CheckAgentProperty 10

if(@ss='NP')
BEGIN
    print 'Not Payment'
END
else
BEGIN
  print 'Payment'
END

上面的查询返回了适当的结果,但是当我在 if 条件下使用它的输出时,它就不起作用了。

【问题讨论】:

请发SP_CheckAgentProperty的代码。 检查这个答案:***.com/questions/11965269/…***.com/questions/211758/… 检查这个答案:***.com/questions/11965269/…***.com/questions/211758/… 存储过程只能返回int,所以给我们看看你的存储过程的代码。 旁注:您应该为您的存储过程使用sp_ 前缀。 Microsoft 有reserved that prefix for its own use (see Naming Stored Procedures),您确实会在未来某个时候冒名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀! 【参考方案1】:

如果程序通过选择它来“返回”值,您必须使用 insert into 类似这样的东西:

declare @ss table (ss varchar(10))

insert into @ss exec SP_CheckAgentProperty 10

if(exists (select 1 from @ss where ss='NP') ...

或者如果它有一个输出参数,那么调用应该是:

declare @ss varchar(10)

exec SP_CheckAgentProperty 10, @ss output

if(@ss='NP')

【讨论】:

¿是否可以从返回多个结果集的过程中选择特定结果集? 我发现只能向数据库添加一个 CLR 过程来添加该功能。 sqlservercentral.com/articles/…

以上是关于Sql server 存储过程中怎么将变量赋值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 存储过程中SELECT 返回值如何赋值给变量

sqlsever怎么定义两个整数变量,并分别赋值,最后输出两

sql server存储过程中SELECT 与 SET 对变量赋值的区别

sql server存储过程中SELECT 与 SET 对变量赋值的区别

在SQL存储过程中,如何声明变量,赋值变量。最好有具体语句配上实例。3Q啦。谢谢各位大侠的帮忙

SQL存储过程中怎样给变量赋值?