2010-03-04 13 views
10

Hi ich habe eine Speicherprozedur, wo ich eine Auswahlabfrage mache. Ich möchte dies durch einen externen Parameter bestellen.Ordnung durch einen Parameter

poste ich ein minimales Beispiel:

CREATE PROCEDURE [dbo].[up_missioni_get_data] 
@order VarChar(100) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT * from missioni ORDER BY ... 
END 

Was von für kann ich das tun, um zu schreiben?

dank

+1

Wie wäre es mit der Rückgabe eines unsortierten Datensatzes und der Sortierung der Ergebnisse im Code? –

+0

Der externe Parameter, den Sie übergeben, ist statisch. Wie können Sie also bestellen? – NibblyPig

Antwort

8

Sie haben 2 Möglichkeiten, entweder eine CASE-Anweisung verwenden, oder verwenden Sie dynamische SQL-

Dies würde

DECLARE @Table TABLE(
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

SELECT * 
FROM @Table 
ORDER BY 
     CASE 
      WHEN @OrderBy = 'Col1' THEN Col1 
      WHEN @OrderBy = 'Col2' THEN Col2 
      ELSE Col1 
     END 

Und dies wäre und Beispiel für eine dynamische SQL-

ein Beispiel für die CASE-Anweisung sein
CREATE TABLE #Table (
     Col1 VARCHAR(10), 
     Col2 VARCHAR(10) 
) 

DECLARE @OrderBy VARCHAR(100) 

SET @OrderBy = 'Col1' 

DECLARE @SqlString NVARCHAR(MAX) 

SELECT @SqlString = 'SELECT * FROM #Table ORDER BY ' + @OrderBy 

EXEC(@Sqlstring) 

DROP TABLE #Table 
+4

+1 Die erste ist geschützt oder sicher wieder sql Injektion – garik

+0

Wenn Sie die Case/When-Methode verwenden, ist es sehr wichtig, dass jede Spalte den gleichen Datentyp hat. SQL berechnet den resultierenden Datentyp eines Case/When-Ausdrucks zum Zeitpunkt der Kompilierung und verwendet den Datentyp-Vorrang, um den Ausgabedatentyp zu bestimmen. Versuchen Sie, eine Ganzzahlspalte mit einer DateTime-Spalte zu mischen, und Sie werden sehen, was ich meine. –

-1

Sie werden Verwendung String-Verkettung und sp_executesql haben.

2

Eine weitere Option ist die Verwendung eines Ausdrucks für die Spalte, nach der Sie sortieren möchten.

DECLARE @OrderBy INT 

SET @OrderBy = 4 

SELECT  * 
FROM   MySourceTable 
ORDER BY COL_NAME(OBJECT_ID('MySourceTable'), @OrderBy) 

Es ist in der Regel eine bessere dynamische SQL zu vermeiden, wenn Sie können.

Verwandte Themen