2017-05-18 4 views
1

Ich schreibe eine gespeicherte Prozedur, die ich ein Jahr als Parameter in diesem übergeben. Ich habe saledatestr als varchar Spalte. Ich mag erhalten wählen, in den vier ersten Ziffern saledatestr hier meine Parameter gleich ist mein Code:Falsche Syntax in der Nähe von etwas

if exists (select * from dbo.sysobjects 
      where id = object_id(N'[dbo].[spSaleCustomerYear]') 
      and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
    drop procedure [dbo].[spSaleCustomerYear] 
GO 

create procedure spSaleCustomerYear 
    (@year varchar) 
with Encryption 
as 
    select 
     c.CustomerCode, 
     PLE.PLEName, 
     s.SaleNo, 
     s.FinalPrice, 
     s.SaleDateStr 
    from 
     SMS.tblsales s 
    left join 
     SMS.tblCustomers c on c.CustomerID = s.CustomerRef 
    left join 
     GNR.tblPrincipalLegalEntities PLE on PLE.PrincipalLegalEntityID = c.PrincipalLegalEntityRef 
    where 
     s.CustomerRef not in (select CustomerRef 
           from SMS.tblSales s1 
           --left join dbo.tblFiscalYear FY on FY.FiscalYearID = s1.FiscalYearID 
           where (LEFT(s1.SaleDateStr, 4) = @year) 
           and SaleDocType = 4) 

Der Fehler in dieser Zeile ist:

(LEFT(s1.SaleDateStr, 4) = @year) 

Bitte helfen Sie mir Jungen.

Vielen Dank im Voraus.

+0

Welche dbms verwenden Sie? Bitte fügen Sie das Tag dafür hinzu – Jens

+0

fügen Sie bitte die vollständige Fehlermeldung – Jens

+0

@Jens Msg 102, Ebene 15, Status 1, Zeile 3 Falsche Syntax in der Nähe von '4'. –

Antwort

3

Siehe Bad habits to kick : declaring VARCHAR without (length) - Sie sollten immer eine Länge für alle varchar Variablen und Parameter, die Sie verwenden

Sie sollten NEVER EVER einen Parameter wie folgt definieren:

create procedure spSaleCustomerYear 
    (@year varchar) 

Diese definiert einen Varchar-Parameter von genau eine Zeichenlänge das ist normalerweise nicht was Sie wollen.

Sie sollten IMMER (keine Ausnahmen!) Definieren eine explizite Länge wenn varchar mit! Dies gilt auch für das Definieren von SQL-Variablen oder das Definieren von Zieltypen in den Anweisungen CAST oder CONVERT.

Veränderung dieser Parameter auf:

(@year varchar(4)) 

und Sie sollten in Ordnung sein.

+0

liebe marc_s es funktioniert noch nicht. –

+1

@AliEshghi: Wie sehen die Werte in 's1.SaleDateStr' aus ?? –

+0

@ marc_s ist es varchar (10) Wert = 'JJJJ/MM/TT' –

0

In der Prozedur, können Sie die Zeile

where (LEFT(s1.SaleDateStr, 4) = @year) 

mit diesem ersetzen und versuchen:

WHERE YEAR(CAST(s1.SaleDateStr AS DATETIME)) = CAST(@year AS INT) 
Verwandte Themen