11
votes

Commande par un paramètre

Bonjour, j'ai une procédure de magasin, où je fais une requête sélectionnée. Je veux commander ceci par un paramètre externe.

i Publier un exemple minimal: P>

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


2 commentaires

Pourquoi ne pas renvoyer un jeu de données non formé et trier les résultats dans le code?


Le paramètre externe que vous passez sera statique, alors comment pouvez-vous commander par elle?


3 Réponses :


-1
votes

Vous allez avoir une concaténation à chaîne d'utilisation et sp_executesql .


0 commentaires

9
votes

Vous avez 2 options, utilisez une instruction de cas ou utilisez dynamique SQL

Ceci serait un exemple de la déclaration de cas p> xxx pré>

et ce serait et Exemple de SQL dynamique P>

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


1 commentaires

Si vous utilisez le cas / la méthode, il est très important que chaque colonne ait le même type de données. SQL évalue le type de données résultant d'un cas / une fois d'expression à la compilation et utilise la priorité de type de données pour déterminer le type de données de sortie. Essayez de mélanger une colonne entière avec une colonne DateTime et vous verrez ce que je veux dire.



2
votes

Une autre option consiste à utiliser une expression pour la colonne que vous souhaitez trier.

DECLARE @OrderBy INT

SET @OrderBy = 4

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


0 commentaires