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

动态创建临时表,插入临时表,然后选择

  •  4
  • DForck42  · 技术社区  · 15 年前

    基本上,我希望能够基于现有表动态创建临时表,然后将值插入临时表,并选择插入的值。

    我已经有了创建临时表的部分,它工作得很好,只是插入和选择表单,它工作得不太好。

    这是我目前的密码。

    declare @table table 
    (
        OrdinalPosition int, 
        ColumnName nvarchar(255), 
        DataType nvarchar(50), 
        MaxChar int, 
        Nullable nvarchar(5)
    )
    declare @i int
    declare @count int
    declare @colname nvarchar(255), @datatype nvarchar(50), @maxchar int
    declare @string nvarchar(max)
    declare @tblname nvarchar(100)
    
    set @tblname='Projects'
    
    set @string='create table #' + @tblname + ' ('
    
    insert into @table 
    (
        OrdinalPosition, 
        ColumnName, 
        DataType, 
        MaxChar, 
        Nullable
    )
    
    SELECT    
        ORDINAL_POSITION ,
        COLUMN_NAME ,
        DATA_TYPE ,
        CHARACTER_MAXIMUM_LENGTH ,
        IS_NULLABLE
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @tblname
    
    set @i=1
    select @count=count(*) from @table
    
    while (@i<=@count)
    begin
    
        select @colname=ColumnName from @table where OrdinalPosition=@i
        select @datatype=DataType from @table where OrdinalPosition=@i
        select @maxchar=MaxChar from @table where OrdinalPosition=@i
    
        if (@maxchar is null)
        begin
    
            set @string = @string + @colname + ' ' + @datatype
    
        end
        else
        begin
    
            set @string = @string + @colname + ' ' + @datatype + '(' + cast(@maxchar as nvarchar(20)) + ')'
    
        end
    
        if (@i=@count)
        begin
    
            set @string = @string + ')'
    
        end
        else
        begin
    
            set @string = @string + ', '
    
        end
    
    
        set @i=@i+1
    end
    
    select @string
    
    exec(@string)
    
    set @string='
    insert into #Projects (pk_prID, prWASSN_ID, prProjectStatus, prBusinessUnit, prServiceLine, prStudyTypeCode, prStudyNumber, prTimePoint, prStudyDirector, 
                          prGroupLeader, prBookedDate, prBookedAmount, prConsumed, prBudgetedHours, prFinalReport, prFinalYear, prFinalMonth, prStartQA, 
                          prLabWorkStarted, prLabWorkCompleted, prProjImpDate, prCompanyName, prCompanyNumber, prIsFTE, prRevisedDeadlineDate, prProjectFinalized, 
                          prBookedYear, prBookedMonth, prCRMQuoteID, prLineItemNumber, prDraftReport, prInternalTargetDeadlineDate, prProtocolSignedDate, 
                          prDataToRWS, prRWSWorkStarted, prFirstDraftToPL, prFirstDraftToQA, prArchivedDate, prToPLForQACommentReview, 
                          prAnticipatedProjectArchiveDate, prToQAWithPLCommentResponse, prProjectReactivatedDate, prQAFinishDate, prSecondDraftReportToClient)
    select *
    from cube.Projects'
    
    select @string
    
    exec (@string)
    
    set @string='select * from #Projects'
    
    exec (@string)
    

    这就是我得到的错误:

    (44行受影响)

    (1行受影响)

    (1行受影响) 消息208,级别16,状态0,第2行 对象名“项目”无效。 消息208,级别16,状态0,第1行 对象名“项目”无效。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Otávio Décio    15 年前

    尝试用两个命名表,这将创建一个全局临时表。它可能是作用域的问题,您可能正在使用exec创建表,但返回时不可见。

        2
  •  5
  •   j0tt    15 年前

    当您调用exec时,我相信它在声明temp表的上下文之外执行。我相信如果您将字符串附加在一起并作为一个exec调用执行,它将成功。另一种选择是使用前缀为而不是的全局临时表。