【问题标题】:Dynamically create temp table, insert into temp table, and then select动态创建临时表,插入临时表,然后选择
【发布时间】:2010-10-24 20:49:05
【问题描述】:

基本上我希望能够根据现有表动态创建一个临时表,然后将值插入到临时表中,然后选择插入的值。

我可以创建临时表的部分工作得很好,只是插入和选择表格不太好。

这是我当前的代码。

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 行 对象名称“#Projects”无效。 消息 208,第 16 级,状态 0,第 1 行 对象名称“#Projects”无效。

【问题讨论】:

    标签: sql-server tsql insert temp-tables


    【解决方案1】:

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

    【讨论】:

    • +1 我只是在输入完全相同的内容。 :)
    • 请记住 ## 是全局的,除了您的进程之外的其他人/进程将能够访问它。如果您的 proc 同时运行或其他人删除并重新创建具有相同名称的全局临时表,这可能会产生真正的问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多