2016-07-15 115 views
-1

我使用動態SQL寫的存儲過程:如何在存儲過程的動態SQL中使用LIKE?

create procedure [dbo].[SearchProduct] 
    (@ProductId int = null, @ProductName nvarchar(50) = null) 
as 
    declare @SqlStr nvarchar(max) 
    declare @ParaList nvarchar(2000) 

    set @SqlStr = 'select p.* from dbo.Product where (1=1) ' 

    if @ProductName is not null 
     set @SqlStr = @SqlStr + 'and(p.ProductName like '''%' + @ProductName2+'%''')' 

    set @ParaList='@ProductId2 int , @ProductName2 nvarchar(50)' 

    EXECUTE SP_EXECUTESQL @SqlStr,@ParaList,@ProductId,@ProductName 

但我得到一個錯誤:如果我改變

Error in "Like operator" : The data types varchar and varchar are incompatible in the modulo operator.

set @SqlStr = @SqlStr + 'and(p.ProductName like ''%' + @ProductName2+'%'')' 

我得到:

@ProductName2 not declare.

回答

0

既然你看看新本,請接受我這些筆記:

  1. 至於你的問題......你的SELECT語句where結束,你按照它與and

select p.* from dbo.Product where '

%之前你應該只有2個單引號不是3 .. Like ' '%' +.... + '%' '...

  1. 當你做動態sql程序,,,總是先用print()方法代替exec來評估你的sql。

  2. 使用case when聲明而不是if statements.它會更好地組織您的代碼。

  3. 由於動態SQL真的是非常不好的做法......你的問題應該是「如何轉換此過程中正常的SQL,而不是動態......」

最後,請接受我的對於缺少樣品,錯誤和幫助鏈接的歉意,我正在用手機回答。

+0

感謝您的建議,@Sufyan。 1>我修好了。如果我有2個單引號:錯誤(必須聲明@ ProductName2)。 2>和3>我這樣做跟着你。 4>動態Sql不好,但我想搜索多值和優化算法:使用動態SQL。 –

+0

@ Mr.Ken最糟糕的是,通過sp_executesql封裝查詢。您可以隱藏整個陳述,並可以明確指示變量是如何讀取和清理的。 –

+0

我使用動態sql因爲我需要在數據庫中搜索多個值。你有另一種最佳算法來解決這個問題嗎? @clifton_h –

0

你有報價或兩個太多:

if @ProductName is not null 
    set @SqlSt r = @SqlStr + 'and (p.ProductName like ''%' + @ProductName2+'%'')'; 

在一個字符串,兩個單引號表示字符串中的一個單引號。第三個單引號然後結束字符串。

+0

但我得到錯誤:必須聲明標量變量「@ ProductName2」。 –

+0

@ Mr.Ken。 。 。該變量用於原始問題中。我不知道它是如何分配的。 –

0

應該在下面。你有錯誤的單引號

if @ProductName is not null 
    set @[email protected]+'and(p.ProductName like ''% + @ProductName2 + %'')' 
+0

它不工作。 –

相關問題