gpt4 book ai didi

sql - 将分隔字符串传递给存储过程以搜索数据库

转载 作者:行者123 更新时间:2023-12-04 06:52:52 25 4
gpt4 key购买 nike

如何将以空格或逗号分隔的字符串传递给存储过程并过滤结果?
我正在尝试做类似的事情 -

Parameter      Value
--------------------------
@keywords key1 key2 key3

然后是我想要的存储过程
  • 查找带有 first 或 last 的所有记录
    名称如 key1
  • 使用第一个或最后一个过滤步骤 1
    名称如 key2
  • 使用名字或姓氏过滤步骤 2,如键 3

  • 另一个例子:
    col1    |       col2        | col3
    ------------------------------------------------------------------------
    hello xyz | abc is my last name | and i'm a developer
    hello xyz | null | and i'm a developer

    如果我搜索任何以下内容,它应该为每个返回吗?
  • “xyz developer”返回 2 行
  • "xyz abc"返回 1 行
  • “abc developer”返回 1 行
  • "hello"返回 2 行
  • “hello developer”返回 2 行
  • "xyz"返回 2 行
  • 最佳答案

    由于您不能使用表参数(不在 SQL Server 2008 上),请尝试传入 CSV 字符串并让存储过程为您将其拆分为行。

    SQL Server 中有多种拆分字符串的方法。本文涵盖了几乎每种方法的优点和缺点:

    "Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

    您需要创建一个拆分函数。这就是拆分函数的使用方式:

    SELECT
    *
    FROM YourTable y
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value

    I prefer the number table approach to split a string in TSQL但是在 SQL Server 中有多种拆分字符串的方法,请参阅上一个链接,其中解释了每种方法的优点和缺点。

    要使 Numbers Table 方法起作用,您需要进行一次时间表设置,这将创建一个表 Numbers包含从 1 到 10,000 的行:
    SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
    ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

    设置 Numbers 表后,创建此拆分函数:
    CREATE FUNCTION [dbo].[FN_ListToTable]
    (
    @SplitOn char(1) --REQUIRED, the character to split the @List string on
    ,@List varchar(8000)--REQUIRED, the list to split apart
    )
    RETURNS TABLE
    AS
    RETURN
    ( ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
    ListValue
    FROM (SELECT
    LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
    FROM (
    SELECT @SplitOn + @List + @SplitOn AS List2
    ) AS dt
    INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
    WHERE SUBSTRING(List2, number, 1) = @SplitOn
    ) dt2
    WHERE ListValue IS NOT NULL AND ListValue!=''
    );
    GO

    您现在可以轻松地将一个以空格分隔的字符串拆分为一个表并加入它或根据需要使用它此代码基于 OPs 最新问题编辑:
    CREATE TABLE YourTable (PK int, col1 varchar(20), col2 varchar(20), col3 varchar(20))
    --data from question
    INSERT INTO YourTable VALUES (1,'hello xyz','abc is my last name','and i''m a developer')
    INSERT INTO YourTable VALUES (2,'hello xyz',null,'and i''m a developer')

    CREATE PROCEDURE YourProcedure
    (
    @keywords varchar(1000)
    )
    AS

    SELECT
    @keywords AS KeyWords,y.*
    FROM (SELECT
    t.PK
    FROM dbo.FN_ListToTable(' ',@keywords) dt
    INNER JOIN YourTable t ON t.col1 LIKE '%'+dt.ListValue+'%' OR t.col2 LIKE '%'+dt.ListValue+'%' OR t.col3 LIKE '%'+dt.ListValue+'%'
    GROUP BY t.PK
    HAVING COUNT(t.PK)=(SELECT COUNT(*) AS CountOf FROM dbo.FN_ListToTable(' ',@keywords))
    ) dt
    INNER JOIN YourTable y ON dt.PK=y.PK
    GO

    --from question
    EXEC YourProcedure 'xyz developer'-- returns 2 rows
    EXEC YourProcedure 'xyz abc'-- returns 1 row
    EXEC YourProcedure 'abc developer'-- returns 1 row
    EXEC YourProcedure 'hello'-- returns 2 rows
    EXEC YourProcedure 'hello developer'-- returns 2 rows
    EXEC YourProcedure 'xyz'-- returns 2 rows

    输出:
    KeyWords       PK    col1       col2                 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz developer 1 hello xyz abc is my last name and i'm a developer
    xyz developer 2 hello xyz NULL and i'm a developer

    (2 row(s) affected)

    KeyWords PK col1 col2 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz abc 1 hello xyz abc is my last name and i'm a developer

    (1 row(s) affected)

    KeyWords PK col1 col2 col3
    -------------- ----- ---------- -------------------- --------------------
    abc developer 1 hello xyz abc is my last name and i'm a developer

    (1 row(s) affected)

    KeyWords PK col1 col2 col3
    -------------- ----- ---------- -------------------- --------------------
    hello 1 hello xyz abc is my last name and i'm a developer
    hello 2 hello xyz NULL and i'm a developer

    (2 row(s) affected)

    KeyWords PK col1 col2 col3
    --------------- ----- ---------- -------------------- --------------------
    hello developer 1 hello xyz abc is my last name and i'm a developer
    hello developer 2 hello xyz NULL and i'm a developer

    (2 row(s) affected)

    KeyWords PK col1 col2 col3
    -------------- ----- ---------- -------------------- --------------------
    xyz 1 hello xyz abc is my last name and i'm a developer
    xyz 2 hello xyz NULL and i'm a developer

    (2 row(s) affected)

    关于sql - 将分隔字符串传递给存储过程以搜索数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866577/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com