Sql 在单个查询中更新和选择(续)

Sql 在单个查询中更新和选择(续),sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我在课堂上问了同样的问题,但无法正确解释我的要求,因此没有得到预期的结果。我想这样做: ALTER PROCEDURE [dbo].[UserTransac] @SponsorId varchar(20), @UserId varchar(20), @SponsorName varchar(50), @Level int=1 AS BEGIN if not exists(select User_Id from UserTransaction) insert into UserTran

我在课堂上问了同样的问题,但无法正确解释我的要求,因此没有得到预期的结果。我想这样做:

ALTER PROCEDURE [dbo].[UserTransac] 
@SponsorId varchar(20),
@UserId varchar(20),
@SponsorName varchar(50),
@Level int=1

AS
BEGIN
if not exists(select User_Id from UserTransaction)
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
else
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level+1,@SponsorName)

总共有14个级别。每个级别可以有任意数量的用户。谢谢你在上一篇文章中提供的答案,我试过了,但是没有一个给我想要的结果。请告诉我如何从这个开始。 到目前为止,我的存储过程如下所示:

ALTER PROCEDURE [dbo].[UserTransac] 
@SponsorId varchar(20),
@UserId varchar(20),
@SponsorName varchar(50),
@Level int=1

AS
BEGIN
if not exists(select User_Id from UserTransaction)
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
else
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level,@SponsorName)
    insert into UserTransaction(Sponsor_Id,User_Id,Level_No,Sponsor_Name) values(@SponsorId,@UserId,@Level+1,@SponsorName)
结束

insert语句一直持续到第14级。
执行存储过程后,我的表将如下所示:

任何有用的链接或答案,在那里我可以得到一个想法如何进行这将有所帮助。多谢各位

UPDATE:

考虑最后两条记录11和12。对于这两项记录,赞助商Id均为RL9115。我希望显示所有级别(如:


下面的查询应处理通过CTE获得所需输出的问题:

DECLARE @TransactionId INT = 11;

WITH levels AS (
    SELECT
        root.Sponsor_Id,
        root.Sponsor_Name,
        root.User_Id,
        root.Level_No
    FROM UserTransaction root
    WHERE root.Transaction_Id = @TransactionId
    UNION ALL
    SELECT 
        s.Sponsor_Id,
        s.Sponsor_Name,
        l.User_Id,
        Level_No = l.Level_No + 1
    FROM UserTransaction s
        INNER JOIN levels l ON l.Sponsor_Id = s.User_Id
)
SELECT DISTINCT *
FROM levels
ORDER BY Level_No;
使用验证了答案


更新:将赞助商名称添加到结果集。

您能否提供一些关于如何填充上述表格的输入?每个新用户插入到表中是否需要插入上一级别+1的级别?只是想更好地理解需求,为您提供所需。谢谢您的回复,我已经更新了我的问题谢谢@sumedha。如果您在插入/选择方面需要帮助,我有点困惑。另外,下次调整你原来的问题可能是你最好的选择,而不是创造一个新的问题。事实上,我不明白你做了什么。谢谢你的回答。我尝试了上面的方法,但得到了一个错误:关键字“END”附近的语法不正确。能否粘贴您尝试运行的整个查询?关键字“END”不在我的响应中,因此语法错误来自您正在运行的查询的其他部分。很抱歉,答复太晚。我已再次执行此操作,只需将上面的内容复制粘贴到新查询中即可。我收到以下错误:Msg 137,级别15,状态2,第1行必须声明标量变量“@TransactionId”。Msg 139,级别15,状态1,第0行无法为局部变量指定默认值。Msg 137,级别15,状态2,第10行必须声明标量变量“@TransactionId”。Msg 102,级别15,状态1,第18行“')附近的语法不正确。非常感谢,现在我得到了所需的输出。我收到以前的错误是因为我使用的是sql server 2005。我把申报部分和分配部分分开,现在工作正常了。声明@TransactionId INT set@TransactionId=11;如果我想将赞助商名称添加到此查询中,我应该如何操作?