基本上我希望能够根据现有表动态创建临时表,然后将值插入临时表,并选择插入的值。
我有一个部分,我可以创建临时表工作得很好,只是插入和选择形式它不是很好。
这是我目前的代码。
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行(s)受影响)
(1行受影响)
(1行(s)受影响) 消息208,级别16,状态0,行2 无效的对象名称'#Projects'。 Msg 208,Level 16,State 0,Line 1 无效的对象名称'#Projects'。
答案 0 :(得分:8)
尝试使用两个##命名表,这将创建一个全局临时表。这可能是范围界定的问题,您可能正在使用exec创建表,但它在返回时不可见。
答案 1 :(得分:5)
当你调用exec时我相信它在你的临时表被声明的上下文之外执行我相信如果你将你的字符串附加在一起并执行一次调用exec就会成功。另一种选择是使用带##作为前缀的全局临时表而不是#。