Thomas Bandt

Über mich | Kontakt | Archiv

Like %-Platzhalter mit Command-Parametern nutzen

Problem: man möchte sich vor SQL-Injection schützen, und benutzt deshalb CommandParameter. Platziert man die nun aber in einem SQL-Statement hinter Like, dann könnte man genauso gut ein = verwenden. Die Frage lautet: wie platziert man da die Platzhalter?

Die Antwort ist recht einfach: man packt sie als String herum. Beispiel:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Testprozedur]
    -- Add the parameters for the stored procedure here
    @type nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

-- Insert statements for procedure here
    SELECT * From Landmaschinen Where [type] Like '%' + @type + '%'
END

Aufruf:

USE [LaMaSQLExport]
GO

DECLARE    @return_value int

EXEC    @return_value = [dbo].[Testprozedur]
        @type = N'Mammut'

SELECT    'Return Value' = @return_value

GO

Achtung:

Auch wenn es simpel ausschaut und auch ist, ein Fallstrick lauert, der mich gerade 10 Minuten gekostet hat ;-) Gibt man aus lauter Eile dem SP-Parameter keine Länge mit, so wird das Ergebnis spannend: in meinem Fall fand er dann auch plötzlich Datensätze, die er gar nicht finden sollte. Also immer schön die Parameterlänge definieren ;-)

Kommentare

  1. Thomas goes .NET schrieb am Donnerstag, 27. November 2008 16:23:00 Uhr:

    Wer - aus welchem Grund auch immer - eine LINQ-to-SQL-Abfrage selbst zusammenbastelt, diese mit Like-Parametern bestückt


« Zurück  |  Weiter »