【问题标题】:Return all id's from table in store procedure从存储过程中的表中返回所有 id
【发布时间】:2016-03-22 14:52:05
【问题描述】:

我继续发现SQL 和存储过程,遇到@feedid 仅返回1 个id 的麻烦,但它有前任。 20.如何返回id数组?

CREATE PROC spGetItemsByUser
    @userName NVARCHAR(50)
AS BEGIN

    DECLARE @userId INT,
            @feedId INT;

    SELECT @userId = ID
    FROM users
    WHERE name = @userName

    SELECT @feedId = feedid
    FROM userstofeed
    WHERE userid = @userId

    SELECT *
    FROM feed
    WHERE ID = @feedId

END

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    你必须使用 table 变量:

    declare @userId table (uid int)
    declare @feedId table (id int)
    
    insert into @userid(uid)
    select id 
    from Users 
    where name = @userName
    
    insert into @feedid(id)
    select feedid 
    from userstofeed 
    where userid in (select uid from @userId)
    
    select * from feed where id in (select id from @feedId)
    

    【讨论】:

      【解决方案2】:

      或者只是简单的加入

      create proc spGetItemsByUser
          @userName nvarchar(50)
      as
      begin
      
          select * from Users usr
          join UsersToFeed utf on usr.id = utf.userID
          join feed fee on utf.feedid = fee.id
          where usr.name = @userName
      end
      

      【讨论】:

        【解决方案3】:
        CREATE PROC spGetItemsByUser
        (
            @userName NVARCHAR(50)
        )
        AS BEGIN
        
            SET NOCOUNT ON;
        
            DECLARE @userId INT
        
            SELECT @userId = ID
            FROM users
            WHERE name = @userName
        
            SELECT *
            FROM feed f
            WHERE EXISTS(
                SELECT *
                FROM userstofeed uf
                WHERE f.ID = uf.feedid
                    AND uf.userid = @userId
            ) 
        
        END
        

        【讨论】:

          【解决方案4】:

          问题是您尝试分步执行此操作。您的变量在任何给定时间都只会保存一个变量,即使您在具有多个结果的SELECT 查询中设置它也是如此。只需将这些全部放入一个查询中,您就可以了:

          SELECT
              F.feed_id,
              F.other_columns    -- NEVER use SELECT *
          FROM
              Users U
          INNER JOIN UsersToFeed UTF ON UTF.userid = U.userid
          INNER JOIN Feed F ON F.feedid = UTF.feedid
          WHERE
              U.UserName = @UserName
          

          【讨论】:

            【解决方案5】:
            CREATE PROC spGetItemsByUser
                @userName NVARCHAR(50)
            AS BEGIN
            
                DECLARE @userId INT,
                        @feedId INT;
            
                SELECT @userId = ID
                FROM users
                WHERE name = @userName
            
                SELECT *
                FROM feed
                WHERE ID IN (
                    SELECT feedid
                    FROM userstofeed
                    WHERE userid = @userId
                )
            
            END
            

            【讨论】:

              猜你喜欢
              • 2015-12-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-13
              • 1970-01-01
              相关资源
              最近更新 更多