Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MS SQL Server中使用containstable时搜索符号(&;)_Sql_Sql Server_Full Text Indexing_Containstable - Fatal编程技术网

在MS SQL Server中使用containstable时搜索符号(&;)

在MS SQL Server中使用containstable时搜索符号(&;),sql,sql-server,full-text-indexing,containstable,Sql,Sql Server,Full Text Indexing,Containstable,我正在使用自动完成下拉列表上的存储过程来检索客户端列表。一些客户在名称中有一个“&”(符号)符号,例如“H&M”、“玛莎百货”,用户希望在“&”符号上搜索 当我直接使用&符号时,它将其用作分词器,而不选择带有“&”符号的列表 是否有任何方法可以使用带有“&”符号的“&”和retrieve值搜索表 希望我已经说明了我需要做什么 谢谢你的帮助 试试这个- DECLARE @char CHAR(1) SELECT @char = '&' DECLARE @sql NVARCHAR(MAX)

我正在使用自动完成下拉列表上的存储过程来检索客户端列表。一些客户在名称中有一个“&”(符号)符号,例如“H&M”、“玛莎百货”,用户希望在“&”符号上搜索

当我直接使用&符号时,它将其用作分词器,而不选择带有“&”符号的列表

是否有任何方法可以使用带有“&”符号的“&”和retrieve值搜索表

希望我已经说明了我需要做什么

谢谢你的帮助

试试这个-

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
此查询在所有数据库中搜索包含带有文本字段的表的子字符串-

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

也许是这样的:

WHERE column LIKE REPLACE(@searchvalue, '&', '/&') ESCAPE '/'
另一个想法是:

DECLARE @randomstring @text

SET @randomstring ='randomstringthatwillneverbeusedforsearch'

WHERE REPLACE(column, @searchvalue, @randomstring) LIKE '%'+@randomstring+'%'

但不知道性能问题

这可以帮助你:在回答其他问题时有两种不同的方法:,或者(更多细节)我想你的意思是
列,比如REPLACE(@searchvalue,&','/&')ESCAPE'/'
),但是如果搜索值包含
/
@hvd,那么这两种方法都是一样的吗?你的方式有什么不同?但是如果搜索值中有/,则会再次出现问题。
ESCAPE
仅适用于模式,而不适用于正在搜索的文本
'a'LIKE'\a'ESCAPE'\'
是真的,
'\a'LIKE'a'ESCAPE'\'
是假的。用另一个想法编辑,应该可以防止@hvd提到的问题。我否决了这个,因为它没有回答这个问题,它回答了一个完全不同的问题。除非我误读了,否则你已经将这个问题扩展到搜索所有表,这不是问题所要问的,你可以这么做。如果你这样做了,它仍然会采取一种完全错误的方法,但这将是对这个问题的回答。但是
o.name
将不具有您期望的值。有一个错误。它应该这样写:
WHERE s.name+'.+o.name='dbo.table1'