Recherche d'ampersand (&) lors de l'utilisation de containstable dans MS SQL Server

J'utilise une procédure stockée sur une list déroulante de saisie semi-automatique pour récupérer une list de clients. Certains clients ont un signe '&' (esperluette) dans le nom, par exemple 'H & M', 'Marks & Spencers' et les users souhaitent effectuer une search sur le signe '&'.

Quand j'utilise directement le signe &, il l'utilise comme un séparateur de mots et ne sélectionne pas la list qui a le signe '&'.

Est-il possible que je puisse chercher dans la table en utilisant les valeurs '&' et retreive qui ont le signe '&'.

J'espère avoir expliqué ce que je dois faire.

Merci pour votre aide!

Peut-être quelque chose comme:

WHERE column LIKE REPLACE(@searchvalue, '&', '/&') ESCAPE '/' 

Une autre idée:

 DECLARE @randomssortingng @text SET @randomssortingng ='randomssortingngthatwillneverbeusedforsearch' WHERE REPLACE(column, @searchvalue, @randomssortingng) LIKE '%'+@randomssortingng+'%' 

Aucune idée sur les problèmes de performance cependant.

Essaye celui-là –

 DECLARE @char CHAR(1) SELECT @char = '&' DECLARE @sql NVARCHAR(MAX) SELECT @sql = ( SELECT CHAR(13) + 'IF EXISTS(SELECT 1 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' WHERE' + b.cols + ') SELECT table_name = ''[' + s.name + '].[' + o.name + ']'' ' + c.cols +' FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' WHERE' + b.cols + ';' FROM sys.objects o JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] JOIN ( SELECT DISTINCT p.[object_id] FROM sys.partitions p WHERE p.[rows] > 0 ) p ON p.[object_id] = o.[object_id] OUTER APPLY ( SELECT cols = STUFF(( SELECT 'OR CHARINDEX(''' + @char + ''', ' + QUOTENAME(c.name) + ') > 0 ' FROM sys.columns c JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE t.name IN ('char', 'nchar', 'ntext', 'nvarchar', 'text', 'varchar') AND c.[object_id] = o.[object_id] ORDER BY c.column_id FOR XML PATH(''), TYPE, ROOT).value('root[1]', 'NVARCHAR(MAX)'), 1, 2, '') ) b OUTER APPLY ( SELECT cols = ( SELECT ', ' + QUOTENAME(c.name) + ' ' FROM sys.columns c JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE t.name IN ('char', 'nchar', 'ntext', 'nvarchar', 'text', 'varchar') AND c.[object_id] = o.[object_id] ORDER BY c.column_id FOR XML PATH(''), TYPE, ROOT).value('root[1]', 'NVARCHAR(MAX)') ) c WHERE o.[type] = 'U' AND b.cols IS NOT NULL FOR XML PATH(''), TYPE, ROOT).value('root[1]', 'NVARCHAR(MAX)') EXEC sys.sp_executesql @sql 

Cette requête search la sous-string dans tous les db qui ont des tables avec des champs de text –

 DECLARE @phrase NVARCHAR(100) SELECT @phrase = '&' DECLARE @db_name SYSNAME , @output NVARCHAR(200) DECLARE db CURSOR READ_ONLY FAST_FORWARD LOCAL FOR SELECT d.name FROM sys.databases d WHERE d.state_desc = 'ONLINE' AND d.name NOT IN ('tempdb', 'model', 'msdb', 'master') --AND d.name = 'your db name' ORDER BY d.name OPEN db FETCH NEXT FROM db INTO @db_name WHILE @@FETCH_STATUS = 0 BEGIN SELECT @output = CONVERT(NVARCHAR(15), GETDATE(), 114) + ': Find in ' + QUOTENAME(@db_name) + ':' RAISERROR(@output, 0, 1) WITH NOWAIT DECLARE @tsql NVARCHAR(MAX) = ' USE [' + @db_name + ']; DECLARE @sql NVARCHAR(MAX) SELECT @sql = ''USE [' + @db_name + '];'' + ( SELECT CHAR(13) + ''IF EXISTS(SELECT 1 FROM '' + QUOTENAME(s.name) + ''.'' + QUOTENAME(o.name) + '' WHERE'' + b.cols + '') PRINT ''''['' + s.name + ''].['' + o.name + '']'''';'' FROM sys.objects o JOIN sys.schemas s ON o.[schema_id] = s.[schema_id] JOIN ( SELECT DISTINCT p.[object_id] FROM sys.partitions p WHERE p.[rows] > 0 ) p ON p.[object_id] = o.[object_id] OUTER APPLY ( SELECT cols = STUFF(( SELECT ''OR CHARINDEX(''''' + @phrase + ''''', '' + QUOTENAME(c.name) + '') > 0 '' FROM sys.columns c JOIN sys.types t ON c.user_type_id = t.user_type_id WHERE t.name IN (''char'', ''nchar'', ''ntext'', ''nvarchar'', ''text'', ''varchar'') AND c.[object_id] = o.[object_id] ORDER BY c.column_id FOR XML PATH(''''), TYPE, ROOT).value(''root[1]'', ''NVARCHAR(MAX)''), 1, 2, '''') ) b WHERE o.[type] = ''U'' AND b.cols IS NOT NULL FOR XML PATH(''''), TYPE, ROOT).value(''root[1]'', ''NVARCHAR(MAX)'') EXEC sys.sp_executesql @sql ' EXEC sys.sp_executesql @tsql PRINT REPLICATE('-', 100) + CHAR(13) FETCH NEXT FROM db INTO @db_name END CLOSE db DEALLOCATE db