代码之家  ›  专栏  ›  技术社区  ›  Vishal

如何存储从sp\u executesql返回的多个值或值列表?

  •  1
  • Vishal  · 技术社区  · 14 年前

    UPDATE : This is what I did -

       set @dyn_sql = '
                            select
                                    @UserName=UserName
                            from
                            (
                            select 
                                    E.ID as EmployeeID,
                                    E.UserName as Username
                                from   
                                    Leaderboard K
                                        inner join Employee E on  K.EmployeeId = E.Id
                                        inner join INFO KD on KD.EmployeeId=E.Id
                                        where  E.CompanyId=4
                             ) as d1'
    DECLARE @leaderboards TABLE
    ( 
     UserName varchar(50)
    ) 
    set @params='@Employee_Id int, @UserName varchar(200) OUTPUT'
    INSERT INTO @leaderboards (UserName)
    EXEC sp_executesql @dyn_sql, @params,@EmployeeId=@Employee_Id OUTPUT,@UserName = @User_Name OUTPUT
    
    SELECT * from @leaderboards
    

    But this is not returning records although if I see the query is right and returns records..


    EXEC sp_executesql @dyn_sql, @params,@EmployeeId=@Employee_Id OUTPUT,@UserName = @User_Name OUTPUT
    
    SELECT @Employee_Id AS EmployeeId,@User_Name AS UserName
    

    但是如果我运行动态sql查询,当我得到一个记录列表时,上面只得到一个值一个人。怎么做我可以存储执行动态sql返回的值列表吗? 返回记录…返回记录…但是这个

    2 回复  |  直到 14 年前
        1
  •  1
  •   Denis Valeev    14 年前

    通过临时表。

    [更新]

    declare @sql nvarchar(max)
      set @sql = '
    select 
        E.ID as EmployeeID, --doesn't really matter how you name them, it's the order that matters
        E.UserName as Username -- and this order should match the order of columns in the insert statement
    from   
        Leaderboard K
            inner join Employee E on  K.EmployeeId = E.Id
            inner join INFO KD on KD.EmployeeId=E.Id
            where  E.CompanyId=4
    '
    DECLARE @LeaderBoard TABLE
    ( 
        EmployeeId int, 
        UserName varchar(50)
    ) 
    INSERT INTO @LeaderBoard (EmployeeId, UserName)
    exec sp_executesql @sql
    
    select * from @LeaderBoard
    
    --Hurray, we made it!
    
        2
  •  1
  •   Martin Smith    14 年前

    您可以插入 EXEC sp_executesql 转换为临时表或表变量。

    DECLARE  @t TABLE
    (
    a INT,
    b INT
    )
    INSERT INTO @t (a,b)
    EXEC sp_executesql N'SELECT 1, 2 UNION SELECT 3, 4 '
    

    或者,动态SQL也可以访问父作用域中声明的临时表(但在动态SQL中创建的任何临时表在执行完成后都将超出作用域)