2014-01-06 250 views
0

我已经构建了我的sql statemnet像下面的方式,但我尝试编译时出现错误。我知道我们可以在字符串中动态构建它,但是想知道我们可以像这样写语句。请寻求建议。SQL Server存储过程SELECT语句与几个IF语句

INSERT INTO #tmpHierarchy ( 
JID , 
EntryDate , 
RefundDate , 
ActionBy , 
Comments , 
CID, 
nLevel 
)  
SELECT 
    JID, EntryDate, RefundDate, ActionBy, Comments, CID, nLevel 
FROM 
    Hierarchy 
WHERE 1=1 
    AND 
IF @FromDate <> '' AND @ToDate <> '' 
BEGIN 
    Convert(varchar,EntryDate,112)>= @FromDate AND Convert(varchar,EntryDate,112) <= @ToDate 
END 

IF @ActionBy <> '' 
BEGIN 
    [email protected] 
END 

IF @JID > 0 
BEGIN 
    [email protected] 
END 

回答

0

实际上,你必须建立一个varchar与查询,然后执行它:

declare @sql varchar(max) 

set @sql = 'INSERT INTO #tmpHierarchy ( 
JID , 
EntryDate , 
RefundDate , 
ActionBy , 
Comments , 
CID, 
nLevel 
)  
SELECT JID,EntryDate,RefundDate,ActionBy,Comments,CID,nLevel FROM Hierarchy WHERE 1=1' 

IF @FromDate <> '' AND @ToDate <> '' 
BEGIN 
    @sql = @sql + ' and Convert(varchar,EntryDate,112)>= @FromDate AND Convert(varchar,EntryDate,112) <= @ToDate' 
END 

IF @ActionBy <> '' 
BEGIN 
    @sql = @sql + ' and [email protected]' 
END 

IF @JID > 0 
BEGIN 
    @sql = @sql + ' and [email protected]' 
END 

exec (@sql) 
+0

没有使动态SQL不能我们这样做? – Thomas

+0

因为你的转换函数可能有点儿乐趣 - 如果你的值无效,你不想让它执行。 – Szymon

0

,你结合IF语句到WHERE条款

SELECT JID, EntryDate, RefundDate, ActionBy, Comments, CID, nLevel 
FROM Hierarchy 
WHERE 1 = 1 
AND (@FromDate = '' OR @ToDate = '' OR (Convert(varchar, EntryDate, 112) >= @FromDate AND Convert(varchar, EntryDate, 112) <= @ToDate)) 
AND (@ActionBy = '' OR ActionBy = @ActionBy) 
AND (@JID <= 0 OR JID = @JID) 
你可以做这样的事情