0

SQL Server に単純なテーブルがあります (2008 R2 を使用しています)。

Sites ( SiteId, Name )

次のデータがあるとします。

-----------------------------------------
- SiteId - Name                         -
-----------------------------------------
-      1 - Foo Bar Baz                  -
-      2 - Qux Tar                      -
-      3 - Contoso                      -
-----------------------------------------

ユーザーが " baz foo" を検索できるようにして、行 1 を返すようにしたいと考えています。SQL Server で入力文字列を分割し、列の値がすべての条件に一致する行のみを返すようにしたいと考えています。

論理的には、これは次のようになります。

function Search(query) {
    query = query.Split(" ");
    sql = "SELECT ..."
    foreach(term in query) {
        sql += "WHERE Name LIKE " + term + " AND ";
    }
    executeSql( sql );
}

T-SQL が配列の操作を非常に困難にしていることは理解していますが、トークン化/用語の一致を実行する組み込みの構成要素が必ずあるはずです。

4

2 に答える 2

0

カスタム関数を作成して SELECT ステートメントを構築する

CREATE FUNCTION [dbo].[FINDWORDS](@SEARCHTERMS VARCHAR(150), @TABLE VARCHAR(100))
RETURNS VARCHAR(200)

AS

BEGIN

DECLARE @CURRENTCOUNT AS INT
DECLARE @MAXCOUNT AS INT
DECLARE @SEARCHSTATEMENT AS VARCHAR(200)
DECLARE @CURRENTITEM AS VARCHAR(50)
DECLARE @WORDS TABLE (ROWNUMBER INT, ITEMS VARCHAR(50))

INSERT INTO @WORDS(ROWNUMBER, ITEMS)
SELECT ROWNUMBER = ROW_NUMBER() OVER(ORDER BY items), items
FROM dbo.splitfn(@SEARCHTERMS, ' ')

SET @CURRENTCOUNT = 1
SET @MAXCOUNT = (SELECT MAX(ROWNUMBER) FROM @WORDS)
SET @SEARCHSTATEMENT = 'SELECT SiteId, Name 
                        INTO #MYTABLE
                        FROM ' + @TABLE + ' WHERE Name LIKE ''%' 

WHILE(@CURRENTCOUNT <= @MAXCOUNT)
    BEGIN
        IF @CURRENTCOUNT > 1
            BEGIN
                SET @SEARCHSTATEMENT = @SEARCHSTATEMENT + ' AND NAME LIKE ''%'
            END
        SET @CURRENTITEM = (SELECT items 
                            FROM @WORDS 
                            WHERE ROWNUMBER = @CURRENTCOUNT)
        SET @SEARCHSTATEMENT = @SEARCHSTATEMENT + @CURRENTITEM + '%'''
        SET @CURRENTCOUNT = @CURRENTCOUNT + 1
    END

RETURN @SEARCHSTATEMENT

END

次に、SELECT ステートメントを呼び出すプロシージャを作成します (関数内から SQL 文字列を実行できないため)。

CREATE PROCEDURE [dbo].[FINDWORDS2] @SEARCHSTRING VARCHAR(200)

AS

BEGIN

DECLARE @STRING AS VARCHAR(200)

SET @STRING = DBO.FINDWORDS(@SEARCHSTRING, 'SITES') + ' SELECT * FROM #MYTABLE'

EXEC(@STRING)

END

これで、手順を使用して特定の文字列を検索する準備が整いました

EXEC FINDWORDS2 @SEARCHSTRING = 'baz foo'
于 2013-01-28T15:35:29.903 に答える
0

さて、データベース内の任意の値を見つけるには、ここを見てください: http://plixa.nl/find-any-value-in-a-database/使用できるスクリプトが含まれています!

于 2013-01-27T10:00:50.623 に答える