2009-06-16 6 views
1

Ich baue eine einmalige Abfrage, um durch eine Reihe von verbundenen Tabellen zu durchlaufen. Die SELECT-Anweisung verwendet "SELECT *". Da es sich um eine Tabelle mit vielen Feldern handelt, möchte ich nicht jede Spalte als Variable angeben. Gibt es eine Möglichkeit, IN ein Array oder SET von einer Art zu holen und einfach die Werte zu nehmen, die ich will?T-SQL, Cursor, FETCH INTO. Wie verwende ich SELECT *

Antwort

3

Apparently not.

INTO @variable_name[ ,...n] 

„Erlaubt Daten aus den Spalten einer platzierten in lokale Variablen holen
Jede Variable in der Liste, von links nach rechts, wird mit der entsprechenden Spalte zugeordnet sind in der Cursor-Ergebnismenge. Der Datentyp jeder Variablen muss übereinstimmen oder eine unterstützte implizite Konvertierung des Datentyps der entsprechenden Ergebnismengenspalte sein. Die Anzahl der Variablen muss mit der Anzahl der Spalten in der Cursorauswahlliste übereinstimmen. "


Wenn Sie schauen, Cursor verwenden Sie eine bessere Flexibilität bei CLR Stored procedures

1

Selbst wenn es war, würden Sie nicht wollen. Das Extrahieren von Feldern ist eine der häufigsten Ursachen für die Leistungsdegradation in einer SQL Server-Anwendung. Dadurch schränken Sie die Fähigkeit des Optimierers ein, Indizes effektiv zu verwenden.

Wie würden Sie vorschlagen, die gewünschten Werte zu erfassen, ohne Spaltennamen anzugeben?

+0

Dies ist eine ONE-OFF-Abfrage, um einige historische Daten zu beheben. Leistung ist mir egal. wie nameofset ['feldname']. Ich möchte einfach nicht alle Felder definieren. Sieht so aus, als ob es nicht möglich ist :( –

1

finden Warum müssen Sie einen Cursor verwenden? Das ist in SQL Server-Szenarien verpönt - die meiste Zeit sind sie unnötig und normalerweise sind sie sehr langsam und beeinträchtigen die Performance.

Was versuchen Sie mit Ihrem Cursor zu erreichen? Könnten Sie das nicht auf einer Set-basierten Weise tun und die Fähigkeiten von SQL Server maximal nutzen?

Marc

1

In 2k5 (SQL 2000 verschiedene Systemobjekte hat), die SQL-Metadaten verwenden, um schnell Abfragen mit langen Listen der Tabelle/Spaltennamen schreiben:

SELECT 
    O.Name + '__' + C.Name + ' = ' + O.Name + '.' + C.Name + ',' 
FROM Sys.Objects O 
JOIN Sys.Columns C 
    ON C.Object_Id = O.Object_Id 
WHERE O.Name IN ('Table1', 'Table1') 
ORDER BY O.Name, C.Column_Id 

Ich bin mir nicht ganz sicher, was Sie mit dem Ergebnissatz machen wollen, aber das könnte ein guter Anfang sein.

Auch könnten Sie Variablen als SQL_VARIANT deklarieren und Ergebnismengen in sie wie folgt FETCH:

DECLARE @Col1 SQL_VARIANT 

SELECT @Col1 = Table1.Column1 FROM Table1 

PRINT CONVERT(varchar(max), @Col1) 

Ich bin mir nicht sicher, was das gewinnt man aber.

0

Dies wird nur für diejenigen empfohlen, die täglich mit SQL arbeiten, nicht speziell um diese Frage zu beantworten.

Das RedGate-Produkt SQL Prompt bietet die Möglichkeit, Platzhalterzeichen mithilfe von Tastenkombinationen (Strg-B, Strg-W) in einzelne Feldnamen zu erweitern. Dies kann Ihnen viel Zeit sparen und es einfacher machen, ein paar Felder aus der Abfrage zu entfernen, wenn Sie Most von ihnen benötigen.

0

In SQL2005 können Sie auch mit der rechten Maustaste auf die Tabelle klicken und eine offene Tabelle auswählen. Dann klickst du auf das kleine SQL-Icon und du siehst die select-Anweisung, etwas wie * aus YourTable auswählen.Wenn Sie erneut auf das! -Symbol klicken, wird die Auswahl * von auf die gesamte Feldliste erweitert. Viel Glück.