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.
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. –
@ 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. –
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 –