2013-02-14 53 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