2016-07-15 3 views
-1

Ich schrieb eine gespeicherte Prozedur mit dynamischen SQL:Wie verwendet man LIKE in dynamischer SQL in einer gespeicherten Prozedur?

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 

Aber ich einen Fehler:

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

Wenn ich ändern:

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

ich:

@ProductName2 not declare.

Antwort

0

Da Sie neu aussehen zu dieser bitte diese Hinweise von mir annehmen:

  1. Was Ihre Frage ... Ihre select-Anweisung endet mit where und folgen Sie es mit and

select p.* from dbo.Product where '

Auch vor % sollten Sie nur 2 einfache Anführungszeichen haben nicht 3 .. Like ' '%' +.... + '%' '...

  1. Wenn Sie dynamische SQL-Prozeduren verwenden, verwenden Sie immer zuerst die Methode print() anstelle von exec, um Ihre SQL-Werte auszuwerten.

  2. Verwenden Sie case when Anweisung statt if statements. es wird Ihren Code viel besser organisieren.

  3. Da die dynamische SQL ist wirklich sehr schlechte Praxis ... soll Ihre Frage sein „wie dieses Verfahren in dem normalen SQL zu konvertieren, anstatt dynamisch ...“

Am Ende, bitte nehmen Sie meinen Entschuldigung für das Fehlen von Samples, Fehlern und Hilfe-Links, wie ich von meinem Handy antworte.

+0

Vielen Dank für Ihren Rat, @Sufyan. 1> Ich habe es behoben. Wenn ich 2 einfache Anführungszeichen habe: error (muss @ ProductName2 deklarieren). 2> und 3> Ich folge dir. 4> Dynamische SQL ist schlecht, aber ich möchte mehrere Werte und Optimierungsalgorithmus suchen: mit dynamischen SQL. –

+0

@ Mr.Ken im schlimmsten Fall, kapseln Sie die Abfrage durch sp_executesql. Sie verbergen die gesamte Aussage und können definitiv bestimmen, wie die Variablen gelesen und bereinigt werden. –

+0

Ich benutze dynamische SQL, weil ich multi-Werte in der Datenbank suchen muss. Haben Sie einen anderen optimalen Algorithmus, um dieses Problem zu lösen? @ Clifton_h –

0

Sie haben ein Angebot oder zwei zu viele:

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

innerhalb eines Strings, zwei einfache Anführungszeichen repräsentieren ein Apostroph in der Zeichenkette. Das dritte einfache Zitat beendet dann die Zeichenfolge.

+0

Aber ich bekomme Fehler: Muss die skalare Variable "@ ProductName2" deklarieren. –

+0

@ Mr.Ken. . . Diese Variable wird in Ihrer ursprünglichen Frage verwendet. Ich weiß nicht, wie es zugewiesen wird. –

0

sollte unten sein. Sie haben das einfache Angebot falsch

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

Es funktioniert nicht. –

Verwandte Themen