【问题标题】: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