SQL Server:在存储过程中使用bigint变量

时间:2015-11-24 21:12:40

标签: sql sql-server stored-procedures

很简单,我正在调用一个过程从一个表中获取主键,然后将该键存储在一个变量中,以便我可以使用它插入另一个需要外键的表中。变量是我所期望的,但是当我使用它时它什么都不返回。

在尝试查看之后,它似乎是WHERE子句的问题并使用变量

DECLARE @ClientId bigint;

SELECT * 
FROM Testing.dbo.Client 
WHERE ClientID = @ClientId

@ClientId值为2

中的客户端ID值为2

当我运行时,我得到了我期望的结果

select * 
from Testing.dbo.Client 
where ClientID = 2

这是设置的地方

DECLARE @ClientId int;
EXECUTE @ClientId = Testing.dbo.GetClientID @ClientName;

GetClientID的位置如下

USE Testing
GO
CREATE PROCEDURE GetClientId
    @ClientName nvarchar(50)
AS 
    SELECT ClientID FROM Testing.dbo.Client WHERE ClientName = @ClientName
GO

现在更多了,所以ClientId在调用proc

后没有设置

4 个答案:

答案 0 :(得分:1)

您需要初始化变量,否则它包含NULL;

DECLARE @ClientId bigint = 2; 
select * from Testing.dbo.Client where ClientID = @ClientId;

如果您在参数列表中有它,请不要使用此名称创建变量:

CREATE PROC stored_procedure
    @ClientID BIGING
AS
BEGIN
   select * from Testing.dbo.Client where ClientID = @ClientId;
END

答案 1 :(得分:0)

如果您尝试使用存储过程设置变量,这是正确的方法:

DECLARE @ClientId Table(ClientId int);

Insert Into @ClientId(ClientId)
Exec Testing.dbo.GetClientID @ClientName;

select * 
from Testing.dbo.Client 
where ClientID = (Select ClientId From @ClientId);

如果您的商店流程抛出许多行,请更改= In,如下所示:

select * 
from Testing.dbo.Client 
where ClientID in (Select ClientId From @ClientId);

答案 2 :(得分:0)

我设法使用OUTPUT变量来解决这个问题,这是我之前没有遇到的

USE Testing
GO
CREATE PROCEDURE AddReading
@ClientName NVARCHAR(50),
@MonitorName NVARCHAR(50),
@DateTime DATETIME,
@Temperature DECIMAL(12, 10),
@Humidity DECIMAL (12, 10),
@Staleness DECIMAL (12, 10)
AS 
DECLARE @ClientId int;
EXEC Testing.dbo.GetClientId @ClientName, @ClientId OUTPUT;

INSERT INTO Testing.dbo.Reading 
(ClientID, MonitorName, DateTime, Temperature, Humidity, Staleness)
VALUES (@ClientId, @MonitorName, @DateTime, @Temperature, @Humidity, @Staleness);
GO

proc GetClientId是

USE Testing
GO
CREATE PROCEDURE GetClientId
@ClientName nvarchar(50),
@ClientId bigint OUTPUT
AS 
Select @ClientId = ClientID FROM Testing.dbo.Client WHERE ClientName = @ClientName
GO

如果您认为这是最好的方式,或者有更好的方法,请告诉我。

答案 3 :(得分:0)

如果你想这样使用:

DECLARE @ClientId int;
EXECUTE @ClientId = Testing.dbo.GetClientID @ClientName;

你可以在程序

中使用RETURN @ClientID
CREATE PROC proc_GetClientID
    @ClientNeme VARCHAR(max)
AS
BEGIN
    DECLARE @ClientID BIGINT
    SELECT @ClientID=1000
    RETURN @ClientID
END


DECLARE @ClientID INT
EXEC @ClientID =dbo.proc_GetClientID 'test'
SELECT @ClientID