【问题标题】:How to search for a word or phrase in SQL Server 2014 Tables?如何在 SQL Server 2014 表中搜索单词或短语?
【发布时间】:2017-03-17 20:54:19
【问题描述】:

我有多个表(例如 TableA、TableB、TableC),其中包含以 6 种语言存储值的列。 SQL Server 2014 中的每个表都有数千行。

在这三个表中搜索单词或短语或搜索字符串的最佳方法是什么(搜索字符串可以在这些表的任何列中找到)?

我是否为这些表中的每一个(6 x 3 = 18 个视图)为每种语言创建单独的视图,然后在视图上创建全文索引?

我还需要获取在表中找到搜索字符串的表名和列名,因为我需要将表名和列名传递给其他存储过程进行进一步处理。

Create TableA ( 
AID int, 
LanguageID int, 
ACol1 nvarchar(100), 
ACol2 nvarchar(100));

Create TableB ( 
BID int, 
LanguageID int, 
BCol1 nvarchar(100), 
BCol2 nvarchar(100),
BCol3 nvarchar(100));

Create TableC ( 
CID int, 
LanguageID int, 
CCol1 nvarchar(100), 
CCol2 nvarchar(100),
CCol3 nvarchar(100),
CCol4 nvarchar(100));

【问题讨论】:

    标签: sql-server full-text-search sql-server-2014 full-text-indexing


    【解决方案1】:
    DECLARE @SearchString VARCHAR(200) = 'John'--give search value
    DECLARE @IterationTable TABLE   (ID INT IDENTITY(1, 1),
                                    Seql VARCHAR(MAX))
    DECLARE @StartLoop INT
    DECLARE @EndLoop INT
    
    IF OBJECT_ID('tempdb..##Result') IS NOT NULL
        DROP TABLE ##Result
    
    CREATE TABLE ##Result (TableName SYSNAME, ColumnName SYSNAME) 
    
    INSERT INTO @IterationTable
    SELECT CONCAT('IF EXISTS(SELECT TOP 1 1 FROM ', QUOTENAME(TABLE_SCHEMA), '.', QUOTENAME(TABLE_NAME), ' WHERE CHARINDEX(''', @SearchString,''', ', QUOTENAME(COLUMN_NAME), ') > 0)', CHAR(13)+CHAR(10), 'BEGIN', CHAR(13)+CHAR(10), 'INSERT INTO ##Result ', CHAR(13)+CHAR(10),'SELECT ''', QUOTENAME(TABLE_NAME),''',''' , QUOTENAME(COLUMN_NAME), '''', CHAR(13)+CHAR(10), 'END')
    --SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE IN('VARCHAR', 'NVARCHAR','CHAR','NCHAR')
    
    SELECT @EndLoop = @@IDENTITY, @StartLoop = 1
    
    --SELECT *,@EndLoop
    --FROM @IterationTable
    
    WHILE @StartLoop <= @EndLoop
    BEGIN
        DECLARE @SQL VARCHAR(MAX) 
    
        SELECT @SQL = Seql
        FROM @IterationTable
        WHERE ID = @StartLoop
    
        EXEC(@SQL);
    
        PRINT @SQL;
    
        SET @StartLoop = @StartLoop + 1
    END
    
    SELECT * FROM ##Result
    
    --select * from tableC
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2015-08-28
      相关资源
      最近更新 更多