2009-05-08 14 views
4

を選択します。基本的には、既存のテーブルに基づいてtempテーブルを動的に作成し、tempテーブルに値を挿入し、挿入された値を選択できます。動的にtempテーブルを作成し、tempテーブルに挿入してから

私はtempテーブルを作成することができますが、ちょうどうまく動作している部分があります。

ここに私の現在のコードです。

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<[email protected]) 
begin 

    select @colname=ColumnName from @table where [email protected] 
    select @datatype=DataType from @table where [email protected] 
    select @maxchar=MaxChar from @table where [email protected] 

    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 (@[email protected]) 
    begin 

     set @string = @string + ')' 

    end 
    else 
    begin 

     set @string = @string + ', ' 

    end 


    set @[email protected]+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行(s)は影響を受けた)

(1行(s)は影響を受けた)

(1行(s)は影響を受け) メッセージ208、レベル16、状態0、行2 オブジェクト名 '#Projects'が無効です。 メッセージ208、レベル16、状態0、行1 オブジェクト名 '#Projects'が無効です。

答えて

7

テーブルに2つの##を付けると、グローバルな一時テーブルが作成されます。それはスコープの問題かもしれませんが、あなたはexecを使ってテーブルを作成しているかもしれませんが、戻ってきても見えません。

+0

+1まったく同じことを入力していたところです。 :) – Tomalak

+0

素晴らしい、2番目の#を追加しました、ありがとう。 – DForck42

+6

##がグローバルであることを覚えておいてください。あなたのプロセス以外の他の人/プロセスもそれにアクセスできます。 procが同時に実行されたり、他の誰かが同じ名前のグローバル・テンポラリ・テーブルを削除して再作成したりすると、実際の問題が発生する可能性があります。 – HLGEM

5

execを呼び出すと、tempテーブルが宣言されたコンテキスト外で実行されると思われます。文字列を一緒に追加してexecに1回の呼び出しとして実行すると成功すると思います。もう1つのオプションは、グローバルテンポラリテーブルを#の代わりに##をプレフィックスとして使用することです。