2017-05-18 171 views
1

我編寫了一個存儲過程,我將其作爲參數傳遞一年。我有saledatestr作爲varchar列。我想選擇其中4個saledatestr第一位數等於我的參數這裏是我的代碼:語法附近的語法不正確

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) 

的錯誤是在這條線:

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

請幫我傢伙。

在此先感謝。

+0

你使用哪種數據庫管理系統?請爲其添加標籤 – Jens

+0

請添加完整的錯誤消息 – Jens

+0

@Jens Msg 102,Level 15,State 1,Line 3 '4'附近的語法不正確。 –

回答

3

Bad habits to kick : declaring VARCHAR without (length) - 你應該總是任何varchar變量和使用

參數提供的長度應該永遠不要這樣定義的參數:

create procedure spSaleCustomerYear 
    (@year varchar) 

這定義了一個只有一個字符長度的varchar參數這通常是而不是你想要什麼。

你應該ALWAYS(沒有例外!)使用varchar當定義一個明確的長度!這也適用於定義SQL變量,或者在CASTCONVERT語句中定義目標類型。

將此參數更改:

(@year varchar(4)) 

,你應該罰款。

+0

親愛的marc_s它還沒有工作。 –

+1

@AliEshghi:'s1.SaleDateStr'中的值看起來像什麼? –

+0

@ marc_s it is varchar(10)value ='yyyy/mm/dd' –

0

在你的程序中,可以更換線路

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

本和嘗試:

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