代码之家  ›  专栏  ›  技术社区  ›  omini data

从存储过程中按排序

  •  0
  • omini data  · 技术社区  · 8 年前

    如何从存储过程中执行order by?

    ALTER PROCEDURE [Data].[filtering_param]
        @param1 NVARCHAR(1000) = NULL
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @Sql Nvarchar(MAX);  
    
        SET @Sql = N'SELECT
                         ps.Mærket AS Mærke, P.DataID,
                         PS.Billed, P.Model, P.vendor, 
                         P.Årgang, P.[Motor Type], 
                         P.Krydsmålet, P.Centerhul, 
                         P.ET, P.Bolter, P.Dæk, P.Fælge, PS.Krydsmålene 
                     FROM
                         Data.Hjuldata P  
                     INNER JOIN
                         Data.Mærke PS ON P.MærkeID = PS.MærkeID
                     ORDER BY 
                         ps.Mærket, P.model
                     WHERE 1 = 1 '
            + CASE WHEN @param1 IS NOT NULL 
             THEN N' AND Krydsmålet = @param1 ' ELSE N'' END
    
        EXEC sp_executesql @Sql, N'@param1  NVARCHAR(1000)', @param1 
    END
    

    我得到这个错误:

    引发异常:“System.Data.SqlClient。”。System.Data.dll中的“SqlException” 其他信息:关键字“WHERE”附近的语法不正确。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Zohar Peled    8 年前

    这个 Order by 子句必须在 where 条款 此外,这里不需要动态sql。你可以这样写:

    Select ps.Mærket AS Mærke
             , P.DataID
             , PS.Billed
             , P.Model
             , P.vendor
             , P.Årgang
             , P.[Motor Type]
             , P.Krydsmålet
             , P.Centerhul
             , P.ET
             , P.Bolter
             , P.Dæk
             , P.Fælge 
             , PS.Krydsmålene 
    from Data.Hjuldata P  
    inner join Data.Mærke PS on P.MærkeID = PS.MærkeID
    WHERE @param1 IS NULL 
    OR Krydsmålet = @param1
    ORDER BY ps.Mærket, P.model
    
        2
  •  0
  •   Cee McSharpface    8 年前

    这个 ORDER BY 追求 WHERE 条款无需编写字符串并将其传递给 sp_executesql ,只需将T-SQL代码写入过程。

    ALTER PROCEDURE [Data].[filtering_param]
    
    @param1 nvarchar(1000)=NULL
    
    AS
    SET NOCOUNT ON
    
    SELECT
        ps.Mærket AS Mærke,
        P.DataID,
        PS.Billed,
        P.Model,
        P.vendor,
        P.Årgang,
        P.[Motor Type],
        P.Krydsmålet,
        P.Centerhul,
        P.ET,
        P.Bolter,
        P.Dæk,
        P.Fælge,
        PS.Krydsmålene
    FROM Data.Hjuldata P  
    INNER JOIN Data.Mærke PS ON P.MærkeID=PS.MærkeID
    WHERE @param1 IS NULL OR Krydsmålet=@param1
    ORDER BY
        ps.Mærket,
        P.model