2013-02-14 120 views
0

我在試圖確定爲什麼我的存儲過程無法正確運行。 問題是當我使用連接參數。完成後,我將有6或7個,每個建立在最後。 我試過每一個變化,包括=,像,%,空格,沒有空格,並且不能拿出正確的語法來使這個操作。 我也做了一個'硬編碼'測試,它工作正常,所以數據是正確的。 幫助!由於TSQL連接參數

下面的代碼 -

ALTER PROCEDURE [dbo].[rspSCLTEST] 

(@RRID as varchar(4), 
@State as varchar(2), 
@Sub as varchar(75)) 
AS 
BEGIN 

SET NOCOUNT ON; 

DECLARE @SQL as varchar(4000) 

SET @SQL = @State 

--add the subdivision to the where statement 
If @Sub = 'ALL' 
SET @SQL = @SQL 
ELSE 
SET @SQL += ' AND (C.SubDivision = '+ @Sub + ')' 


SELECT C.CRID, C.DOT, C.RR, C.Pref, C.MP, C.Division, C.SubDivision, C.City, C.Street, 
    C.State, C.County, C.RestrictedCounty, C.Remarks, C.SpecialInstructions, C.Route, C.ThirdAppRequired, 
    C.MainTrks, C.OtherTrks, C.OnSpur, C.MaxSpeed, C.SubContracted, C.FenceEncroachment, C.Lat, C.Long, 
    C.PropertyType, C.WarningDevice,C.Surface, C.ROWNE, C.ROWNW, C.ROWSE, C.ROWSW, C.ROWWidth, C.ExtNE, 
    C.ExtNW, C.ExtSE, C.ExtSW, C.TempActive, C.PCO, A.App1Date, A.App1Cut, A.App1Spray, A.App1Inspect, 
    A.App2Date, A.App2Cut, A.App2Spray, A.App2Inspect, A.App3Date, A.App3Cut, A.App3Spray, A.App3Inspect 

    FROM Crossings AS C LEFT OUTER JOIN AppData AS A ON C.CRID = A.CRID 
    WHERE (C.DeletedCrossing = 0) AND (C.RR = @RRID) 
    AND C.State = @SQL 


END 
+0

您需要首先處理您的問題,發佈一些代碼,並且我認爲您嘗試連接參數,如果使用'+'運算符。 – scc 2013-02-14 18:44:24

回答

2

的問題是,你混淆了動態SQL與參數更換。嘗試是這樣的:

and c.state = @state and (@sub = 'ALL' or c.subdivision = @sub) 

你有這個書面的方式,你檢查:

and c.state = '<state> and c.subdivision = @sub' 

也就是說,第二個條款不被解釋爲條款,它是解釋爲國家的一部分。

+0

這裏的問題是,如果@sub ='All',我根本不需要包含參數。 「全部」意味着給我所有的細分,而不僅僅是我要求的細分。我也試圖說If Sub ='All'SQL = SQL +'(C.SubDivision ='+ C.SubDivision +')' – 2013-02-14 18:47:54

+0

@CindyBrozyno。 。 。這就是這個邏輯所做的。 – 2013-02-14 18:48:51

+0

謝謝,我會給它一個鏡頭。 – 2013-02-14 18:50:46

0

這條線:

SET @SQL += ' AND (C.SubDivision = '+ @Sub + ')' 

這行:

AND C.State = @SQL 

出現犯罪嫌疑人。我只能假設你的數據,但看起來你有兩個不同的對象:狀態和細分。

什麼樣的數據是C.State?它只是國家縮寫嗎? (OR,WA,MO,MN,AZ等)。如果是這樣,你將永遠得不到WHERE C.State = WA123的正面結果(假設'123'是一個細分值)。

在任何情況下,你可以做這樣的事情? - >

WHERE C.State = @state AND C.Subdivision = @sub