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 ;-)