Créer dynamiquement de la table temporaire, l'insérer dans la table temporaire, puis sélectionnez
Fondamentalement, je veux être en mesure de créer dynamiquement une table temporaire à partir d'une table existante, puis insérer des valeurs dans la table temporaire, et sélectionnez les valeurs insérées.
je suis arrivé à la partie où je peux créer la table temp fonctionne très bien, c'est juste que de l'insertion et de la sélection de la forme ne fonctionne pas trop bien.
voici mon code actuel.
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)
c'est l'erreur que j'obtiens:
(44 ligne(s) affectée)
(1 ligne(s) affectée)
(1 ligne(s) affectée)
Msg 208, Niveau 16, État 0, La Ligne 2
Nom d'objet non valide '#Projets".
Msg 208, Niveau 16, État 0, La Ligne 1
Nom d'objet non valide '#Projets".
OriginalL'auteur DForck42 | 2009-05-08
Vous devez vous connecter pour publier un commentaire.
Essayer de le nom de la table avec deux ##, cela va créer un mondial de la table temporaire. Il pourrait être un problème de portée, vous pourriez être la création de la table avec exec, mais il n'est pas visible quand il revient.
génial, ajouter le deuxième # travaillé, merci.
Ne rappelez-vous que ## est global, d'autres personnes/processus en plus de votre processus sera en mesure d'y accéder. Cela peut créer des problèmes réels, si ton proc tourne en même temps ou quelqu'un d'autre gouttes et recrée un mondial de la table temporaire de l'esprit du même nom.
OriginalL'auteur Otávio Décio
Lorsque vous appelez exec je crois qu'il s'exécute en dehors du contexte où votre table temporaire a été déclaré je crois que si vous avez ajouté vos chaînes et exécuté comme un appel à exec il allait réussir. L'autre option est d'utiliser une approche globale de la table temporaire avec ## comme le préfixe à la place de #.
OriginalL'auteur j0tt