2016-04-01 5 views
0
ALTER PROCEDURE [dbo].[ViewSo] 
    @Dt1 as datetime, 
    @Dt2 as datetime, 
    @CusName as nvarchar, 
    @so_no as nvarchar 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM 
     (SELECT 
      0 as stat, 
      m.id, f.id as fg_id, f.fg_des, m.so_no, 
      Replace(CONVERT(NVARCHAR, CAST(m.so_date AS DATE) , 106),' ','-') AS so_date, 
      Convert(NVARCHAR,CAST(m.so_date AS DATE),101) AS so_date1, 
      m.cus_name, m.so_cus_id, m.doc_no, m.sale_person, m.so_rem, 
      f.fg_des AS eXP1, f.fg_qty, 
      CONVERT(VARCHAR(10), CAST(f.req_date AS DATE), 101) AS req_date, 
      CASE 
       WHEN COALESCE (q.tot_req_qty, 0) < f.fg_qty 
        THEN 'Not Updated' 
        ELSE 'Updated' 
      END AS req_qty_stat, 
      'SO No :' + CONVERT(varchar(15), m.so_no) + '/SO Date :' + CONVERT(varchar(15), REPLACE(CONVERT(NVARCHAR, CAST(m.so_date AS DATE), 106), ' ', '-')) + '/Cus Name :' + CONVERT(varchar(15), m.cus_name) + '/Sales Prsn :' + CONVERT(varchar(15), m.sale_person) AS filter , 
      f.fg_no,m.so_stat, 
      m.del_flag, m.st_stat, m.st_rem  
     FROM 
      so_mas AS m 
     INNER JOIN 
      so_fg AS f ON m.id = f.so_id 
     LEFT OUTER JOIN  
      (SELECT   
        fg_id, SUM(req_qty) AS tot_req_qty  
       FROM 
        fg_qty 
       WHERE   
        (del_flag = 0)  
       GROUP BY fg_id) AS q ON q.fg_id = f.id 
     WHERE 
      m.del_flag = 0) AS S 
    WHERE 
     CONVERT(datetime, s.so_date) BETWEEN @Dt1 AND @Dt2 
     AND S.cus_name LIKE 
        CASE WHEN @CusName = '' THEN S.cus_name 
         ELSE +'%' + @CusName + '%' 
        END 
    ORDER BY 
     s.so_date; 
END 

Dies ist meine gespeicherte Prozedur, die Anweisung für den Fall übergeben. Wenn als Abfrage ausgeführt wird, funktioniert es gut. Wenn ich als gespeicherte Ware verwende, führt das zu falschen Ergebnissen.Stored Procedure übergeben wie Anweisung in Fall

Bitte helfen Sie mir zu lösen.

+0

Bitte versuchen Sie einen * minimal * Beispiel zu schaffen, was Sie zu tun versuchen. Ich habe im Moment keine Ahnung. Außerdem haben Sie Ihre Parameter mit ziemlicher Sicherheit falsch deklariert, es sei denn, Sie haben die Absicht, dass '@ CustNo' und' @ so_no' nur bis zu 1 Zeichen enthalten sollten. Bitte beachten Sie [Schlechte Angewohnheiten, um zu kicken: VARCHAR ohne (Länge) deklarieren] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without- length.aspx) –

+0

Ihr Code ist sehr schwer zu lesen. Stellen Sie sicher, dass Sie es besser formatieren, damit wir klar lesen können und wissen, was falsch ist. Auch habe ich mehrere WHERE-Anweisungen bemerkt, die ich vorschlagen, dass Sie stattdessen HAVING verwenden. – Husein

Antwort

0

Ersetzen Sie diesen Teil WHERE

AND S.cus_name LIKE 
       CASE WHEN @CusName = '' THEN S.cus_name 
        ELSE +'%' + @CusName + '%' 
       END 

Mit

AND S.cus_name LIKE 
       CASE WHEN @CusName = '' THEN S.cus_name 
        ELSE '%' + @CusName + '%' 
       END