【问题标题】:Finding and using value within stored procedure在存储过程中查找和使用值
【发布时间】:2020-01-29 16:17:26
【问题描述】:

我试图找到一个值,然后在同一个 SQL 存储过程的另一个语句中使用它。但是我迷失了语法(如果这是可能的话)。

下面我发布了我的代码,因为这将是完全解释的最简单方法。

CREATE PROCEDURE FindRuidForUser
    @Email nvarchar (160),
    @RUId int,
    @DeskLocation nvarchar(160),
    @ExtraInformation nvarchar(160),
    @PrimaryWorkStation nvarchar(160),
    @Date datetime
AS
    SELECT RUId 
    FROM RegisteredUsers
    WHERE Email = @Email

RUId = @RUId

Then

    INSERT INTO diffrenttable (RUId, PrimaryWorkStation, DeskLocation, ExtraInformation, TimeCreated)
    VALUES (@RUId, @PrimaryWorkStation, @DeskLocation, @ExtraInformation, @TimeCreated)

我首先想找到 RUId,然后我想将它与我将使用的其他变量一起插入到一个单独的表中。

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 您应该能够在INSERT 语句中使用SELECT TOP 1 RUId FROM RegisteredUsers WHERE Email = @Email 代替@RUId。但是您可能需要添加一些检查是否确实存在Email = @Email

标签: sql sql-server


【解决方案1】:

我认为您正在寻找语法。请注意,这只是我使用创建名称为@SomeNewRUID 的变量的一种语法。创建后的值已被赋值并在插入语句中使用。

create procedure FindRuidForUser
@Email nvarchar (160),
@RUId int,
@DeskLocation nvarchar(160),
@ExtraInformation nvarchar(160),
@PrimaryWorkStation nvarchar(160),
@Date datetime
as
Begin
   declare @SomeNewRUID int
   select @SomeNewRUID = RUId from RegisteredUsers where Email = @Email

   INSERT into diffrenttable (RUId,PrimaryWorkStation,DeskLocation,ExtraInformation, 
  TimeCreated)
   values (@SomeNewVariable, @PrimaryWorkStation, @DeskLocation, @ExtraInformation, @TimeCreated)
End

这是来自reference 的另一个示例,以了解更多如何在 SQL Server 存储过程中使用该变量。

CREATE  PROC uspGetProductList(
    @model_year SMALLINT
) AS 
BEGIN
    DECLARE @product_list VARCHAR(MAX);

    SET @product_list = '';

    SELECT
        @product_list = @product_list + product_name 
                        + CHAR(10)
    FROM 
        production.products
    WHERE
        model_year = @model_year
    ORDER BY 
        product_name;

    PRINT @product_list;
END;

注意,只有一个值应该来自 select 语句,同时将它分配给该变量,否则,它会给出如下错误:

SQL Server Subquery returned more than 1 value error.

【讨论】:

    【解决方案2】:

    对您的存储过程进行一些调整: 在你的

    select top 1 @RUId = RUId from RegisteredUsers
    where Email = @Email
    

    我添加了一个顶部,以防您为一封电子邮件返回更多 RUI。

    create procedure FindRuidForUser
    
    @Email nvarchar (160),
    @RUId int,
    
    @DeskLocation nvarchar(160),
    @ExtraInformation nvarchar(160),
    @PrimaryWorkStation nvarchar(160),
    @Date datetime
    
    
    as
    
    select top 1 @RUId = RUId from RegisteredUsers
    where Email = @Email
    
    
    
    Then
    
    INSERT into diffrenttable (RUId,PrimaryWorkStation,DeskLocation,ExtraInformation, TimeCreated)
    values (@RUId, @PrimaryWorkStation, @DeskLocation, @ExtraInformation, @TimeCreated)
    

    【讨论】:

      【解决方案3】:

      您有以下代码:

      select RUId from RegisteredUsers
      where Email = @Email
      
      RUId = @RUId
      

      您应该能够执行以下操作:

      select @RUId = RUId from RegisteredUsers
      where Email = @Email
      

      或者,你也可以这样写:

      set @RUId = (select RUId from RegisteredUsers
      where Email = @Email)
      

      您当前的代码行不起作用,因为 select 语句没有将您的请求分配给任何东西。将参数设置为您要查找的参数应该可以解决问题。

      【讨论】:

      • @SS_DBA,感谢您的关注。对我的明确监督。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2019-11-09
      相关资源
      最近更新 更多