2013-04-05 98 views
1

如何將存儲過程中的兩個SQL參數傳遞給WHERE子句中的查詢字符串?我遇到的問題是在@iField中。如果我刪除它並替換爲InfoID LIKE'%'+ @iSearch +'%',它可以工作,但我需要添加@iField。

WHERE CustomerID = @CustomerID AND @iField LIKE '%' + @iSearch + '%'將存儲過程中的多個參數傳遞給QueryString參數

回答

0

T-SQL不允許你爲對象名稱設置變量(它會很方便,儘管如此,不會)。兩個選項確實如此:

1)使用動態SQL例如sp_executesql的(http://www.techrepublic.com/blog/datacenter/generate-dynamic-sql-statements-in-sql-server/306

2)使用IF ... ELSE例如

IF @iField = 'InfoId' 
    SELECT ... 
    WHERE CustomerID = @CustomerID AND InfoId LIKE '%' + @iSearch + '%' 
ELSE IF @iField = '<some other field>' 
    SELECT ... 
    WHERE CustomerID = @CustomerID AND <some other field> LIKE '%' + @iSearch + '%' 
etc. 
+0

基本上,我想知道是否有可能寫的WHERE子句爲:'WHERE @iField LIKE '%' + @iSearch + '%''。 – 2013-04-05 16:08:37

+0

不,你不能用變量名取代列名,表名,過程名等,除非你建立一個sql字符串並像上面(1)中那樣動態地執行它。 – 2013-04-05 16:16:06

+0

非常有趣的文章。謝謝你的鏈接。 – 2013-04-05 17:03:45

0

如果我理解正確的,你只是想在like運營商限制在一個特定的列?

declare @yourTable table (i int, FirstName varchar(10), LastName varchar(10)) 
insert into @yourTable 
    select 1, 'john', 'doe' union all 
    select 2, 'jane', 'doe'; 


declare @iField varchar(10), 
     @iSearch varchar(10); 


select @iField = 'FirstName', 
     @iSearch = 'j' 


select * 
from @yourTable 
where (@iField = 'FirstName' and FirstName like '%' + @iSearch + '%') or 
     (@iField = 'LastName' and LastName like '%' + @iSearch + '%') 
1

至於你是媒體鏈接使用過程

Declare @Query nvarchar(max) 
Select @Query= 
' 
Select * from dbo.Invoice 
WHERE CustomerID = '+Cast(@CustomerID as Varchar(20)) 
+' AND ['+ @iField +'] LIKE ''%' + @iSearch + '%'' 
' 

--Print @Query 
Exec(@Query) 
+0

感謝您的幫助。使用你的建議,我得到一個'無效的列名''+ @iField +''錯誤。 – 2013-04-05 16:17:28

+0

@g_shockTan只是複製我的帖子我得到結果打印將顯示例如選擇* from dbo.Invoice WHERE CustomerID = 1並且[BillNr] LIKE'%aus%'嘗試使用print而不是Exec,可能會缺少引用... – bummi 2013-04-05 16:24:46

相關問題