Динамически создать временную таблицу, вставить в временную таблицу и затем выбрать - PullRequest
4 голосов
/ 08 мая 2009

В основном я хочу иметь возможность динамически создавать временную таблицу на основе существующей таблицы, а затем вставлять значения во временную таблицу и выбирать вставленные значения.

У меня есть часть, где я могу создать временную таблицу, которая работает просто отлично, просто вставка и выбор формы не очень хорошо работают.

вот мой текущий код.

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".

Ответы [ 2 ]

8 голосов
/ 08 мая 2009

Попробуйте назвать таблицу двумя ##, это создаст глобальную временную таблицу. Это может быть проблемой с областью видимости, возможно, вы создаете таблицу с помощью exec, но она не видна, когда она возвращается.

5 голосов
/ 08 мая 2009

Когда вы вызываете exec, я полагаю, что он выполняется вне контекста, в котором была объявлена ​​ваша временная таблица. Я полагаю, что если вы добавили свои строки вместе и выполнили как один вызов exec, то это было бы успешно. Другой вариант - использовать глобальную временную таблицу с префиксом ## вместо #.

...