SqlCommand mit Parameter und temporaerer Tabelle

27/08/2007 - 17:16 von Christoph Schneegans | Report spam
Hallo allerseits!

Ich hatte kürzlich in
<http://google.com/groups?threadm=5j...al.net> ein
Problem geschildert, für dessen Lösung ich eine temporàre Tabelle benötige. Bei
der Umsetzung in ADO.NET taucht jetzt aber das nàchste Problem auf, offenbar
deshalb, weil ich außerdem mit Parametern arbeite.

Ich habe eine Tabelle "table1" mit einer INT- und einer NTEXT-Spalte:

id data
== 1 Lorem
1 ipsum
2 dolor
2 sit
3 amet

Im Prinzip möchte ich folgende Anweisungen über ADO.NET ausführen:

select * into #temp from table1 where id > @threshold;
alter table #temp add UniqueID int identity(1,1);
select * from #temp order by UniqueID;

Der naive Ansatz, alles in _ein_ SqlCommand zu packen, scheitert: "Invalid column
name 'UniqueID'." Das ist nicht verwunderlich, weil man ja auch im Query Analyzer
vor der letzten Anweisung ein GO einfügen muß.

Ich folge also Günter Prossliners Empfehlung aus
<http://google.com/groups?selm=OeHO2...hx.gbl> und
verwende zwei SqlCommand-Objekte, wobei das erste die Anweisungen

select * into #temp from table1 where id > @threshold;
alter table #temp add UniqueID int identity(1,1);

und das zweite die Anweisung

select * from #temp order by UniqueID;

ausführt. Auch dieser Ansatz funktioniert aber nicht: "Invalid object name
'#temp'." Offenbar hat das zweite SqlCommand keinen Zugriff auf #temp. Im SQL
Profiler habe ich gesehen, daß das erste SqlCommand überraschenderweise
mittels sp_executesql ausgeführt wird.

<http://google.com/groups?selm=3eafa543$1%40newsgroups.borland.com> bestàtigt
diese Vermutung. Aber das kann's doch nun nicht sein. Bin ich etwa in diesem
Szenario wirklich gezwungen, Parameter durch String-Konkatenation zu ersetzen?
Oder gibt es auch eine elegante Lösung?

<http://schneegans.de/web/xhtml/> · Klare Antworten zu XHTML
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
27/08/2007 - 17:27 | Warnen spam
Hallo Christoph,

"Christoph Schneegans" schrieb:

select * into #temp from table1 where id > @threshold;
alter table #temp add UniqueID int identity(1,1);
select * from #temp order by UniqueID;



Das làsst sich nicht in eine Stored Procedure packen? Damit hàttest du
IMO die wenigsten Probleme.

Der naive Ansatz, alles in _ein_ SqlCommand zu packen, scheitert: "Invalid column
name 'UniqueID'." Das ist nicht verwunderlich, weil man ja auch im Query Analyzer
vor der letzten Anweisung ein GO einfügen muß.



Nö. Du müsstest lediglich den CommandText àndern und dann nochmals ExecuteNonQuery
o.à. ausführen.

verwende zwei SqlCommand-Objekte,



Aber nicht mit einem jeweils eigenen Connection-Objekt, oder? Falls doch, dürfte
hier das Problem liegen. Poste doch mal den entsprechenden Code.

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen