很简单,我正在调用一个过程从一个表中获取主键,然后将该键存储在一个变量中,以便我可以使用它插入另一个需要外键的表中。变量是我所期望的,但是当我使用它时它什么都不返回。
在尝试查看之后,它似乎是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
后没有设置答案 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 @ClientIDCREATE 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