2011-06-10 104 views
0

我需要一个想法将以下“If's”条件转换为原始SQL语句。 (无动态SQL)将动态JOINS转换为SQL语句

Dim strVar1 as String, strVar2 as String, strVar3 as String, intSet Int32 

.Append("SELECT * FROM TABLE_A as A ") 
.Append("INNER JOIN TABLE_B as B ON A.Code=B.Code_A ") 

If strVar1.Length > 0 Then 
    .Append("LEFT JOIN TABLE_C as C ON C.Code=A.Code_C ") 
    .Append("LEFT OUTER JOIN TABLE_D as D on C.Code=D.Code_C AND D.Col1 IN (1,NULL) ") 
End If 

If strVar2.Length > 0 Or strVar3.Length > 0 Then 
    .Append("LEFT OUTER JOIN TABLE_E as E ON A.Code=E.Code_A ") 
    .Append("LEFT OUTER JOIN TABLE_F as F ON E.Col1=F.Col1 ") 
    .Append("INNER JOIN TABLE_G ON as G ON F.Code=G.Code_F AND G.Col1=1 ") 
End If 

Select Case intType 
    Case 1 , 2  
     If intSet <> -1 Then 
     .Append("LEFT OUTER JOIN TABLE_H H on A.code=H.code_A AND H.code_H=1 AND H.Pos=1 ") 
     Else 
     .Append("LEFT OUTER JOIN TABLE_H H on A.code=H.code_A AND H.Pos=1 ") 
     End If 
    Case 3 , 4 
End Select 
+0

intSet从哪里来? 。附录中的“With”在哪里? – gbn 2011-06-10 07:38:39

+0

只是一句话。 'D.Col1 IN(1,NULL)'应该是'(D.Col1 = 1或者D.Col1 IS NULL)' – 2011-06-10 07:41:18

回答

0

您可以尝试WHEN SQL构造! 逻辑:所有连接都将在那里。但是,如果您想根据一些条件加入,把交叉表列中加入条款别人同桌列 喜欢的东西:

SELECT DISTINCT TABLE_A.* FROM TABLE_A as A 
INNER JOIN TABLE_B as B ON A.Code=B.Code_A 
LEFT JOIN TABLE_C as C ON C.Code= 
    CASE WHEN LEN(@strVar1)>0 
    THEN 
    A.Code_C -- join with your table 
    ELSE 
    C.Code -- join with itself to do nothing 
    END 
LEFT OUTER JOIN TABLE_D as D on C.Code= 
    CASE WHEN LEN(@strVar1)>0 THEN 
    D.Code_C AND D.Col1 IN (1,null) 
    ELSE 
    C.Code 
    END 

0

我不知道这很容易,或者甚至有可能将您的动态sql代码转换为带有参数的单个sql查询。我感觉唯一的解决方案是为您在测试中使用的每个值组合创建一个查询。这是很多的疑问:如果我正确计算的话。

如果你的目标是加快你的查询,我很肯定这会有所帮助:执行计划不需要每次计算。但这是以更复杂的代码为代价的。