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

2023-12-08

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

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

然后是我首先要的存储过程

  1. 查找所有包含第一个或最后一个的记录 名称如 key1
  2. 使用第一个或最后一个过滤步骤 1 名称如 key2
  3. 使用像键 3 这样的名字或姓氏过滤步骤 2

另一个例子:

col1    |       col2        | col3
------------------------------------------------------------------------
hello xyz   |   abc is my last name | and i'm a developer
hello xyz   |       null        | and i'm a developer

如果我搜索任何以下内容,它应该返回每个内容吗?

  1. “xyz 开发人员”返回 2 行

  2. “xyz abc”返回 1 行

  3. “abc 开发者”返回 1 行

  4. “hello”返回 2 行

  5. “你好开发者”返回 2 行

  6. “xyz”返回 2 行


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

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

“当表值参数无法满足 SQL Server 2005 及更高版本中的数组和列表时”作者:Erland Sommarskog

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

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

我更喜欢在 SQL 中使用数字表方法来分割字符串但是 SQL Server 中有多种分割字符串的方法,请参阅前面的链接,其中解释了每种方法的优点和缺点。

为了使数字表方法发挥作用,您需要执行一次时间表设置,这将创建一个表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 

您现在可以轻松地将空格分隔的字符串拆分到表中并加入它或根据需要使用它此代码基于 OP 的最新问题编辑:

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

OUTPUT:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将分隔字符串传递给存储过程以搜索数据库 的相关文章

  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 如何从子查询 SQLite 接收两个值

    我是一个自学的 SQLite 新手 我有三个表 person pet person pet schema 是 CREATE TABLE person id INTEGER PRIMARY KEY first name TEXT last n
  • 使用 TSQL 选择 XML 节点

    我的 SQL Server 2008 数据库表有一个 XML 字段 我想从该字段以及其他字段中选择节点 例如 考虑下表 DECLARE TestTable AS TABLE Id VARCHAR 20 Name XML INSERT INT
  • 当您在 SQL Server 中创建新登录名时,它默认选择 db_owner

    我在 SQL Server 2008 R2 中创建新的 SQL 用户时遇到一些问题 当我使用 SQL Server Management Studio 时 它会检查db owner默认情况下的角色成员资格 我只想创建一个具有只读访问权限的新
  • 如何在 MySQL 查询本身中检索 JSON 数组中存储的值?

    我有下表 product id product name image path misc 1 flex http firstpl course level id 19 group id 40067 2 Android http firstp
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • 从逗号分隔的字符串中删除重复项 (Amazon Redshift)

    我正在使用亚马逊红移 我在该字符串中有一个列存储为逗号分隔 例如Private Private Private Private Private Private United Healthcare 我想使用删除其中的重复项query 所以结果
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 如何创建从表中最大值开始的 Oracle 序列?

    尝试在 Oracle 中创建一个以特定表中的最大值开始的序列 为什么这不起作用 CREATE SEQUENCE transaction sequence MINVALUE 0 START WITH SELECT MAX trans seq
  • 使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?

    我正在这样做 students Student find gt all return this gt render process array students gt students 然后在视图中 foreach students as

随机推荐

  • 如何修复 jslint The '&&' subexpression should bewrapped in parens 错误

    我将所有内容都放在括号中 但下面的代码仍然在 jslint 中抛出错误 Problem at line 5 character 104 The subexpression should be wrapped in parens if typ
  • .htaccess 导致所有页面被下载

    我添加了以下行 htaccess AddType application x httpd php html htm 当我尝试加载侧面的任何页面时 我的浏览器会尝试下载该页面 我究竟做错了什么 Thanks 最有可能的 您没有为您的网络服务器
  • 将 JLabels 置于 JPanel 中心

    我正在制作一个记分程序 但遇到了问题 我试图做的是在顶部有一个 JPanel 其中包含两个 JPanel 而 JPanel 又包含两个团队名称 我很困惑为什么程序顶部的两个 JLabel 没有位于它们所包含的 JPanel 内部的中心 im
  • c_str 的使用是否带有异常未定义行为?

    我见过几个类似的代码片段 如下所示 struct MyExcept std exception explicit MyExcept const char m noexcept message m const char what const
  • 如何运行在关闭 PuTTY SSH 会话后仍然运行的 Linux 命令?

    我通过 putty 连接到我的 NAS 它在上面运行 Linux 我想将一个大目录从一个位置移动到另一个位置 关闭 Putty 会话后是否可以保持进程运行 我担心如果我关闭腻子 文件将不会被复制到最后 使用 nohup 开始任务 并使用 将
  • jQuery ui 选项卡中的多个 jQgrid

    我遇到一个问题需要帮助 我有 3 个 jQueryUI 选项卡 第一个包含项目网格 第二个保存工单网格 第三个只是发出警报以验证显示功能是否正常工作 问题是我在第二个选项卡上没有网格 第一个负载正常 如果我注释掉第一个选项卡的代码 第二个网
  • Ruby on Rails:自定义操作

    我是rails新手 所以我向你解释一下我的情况 我有一个用户模型和一个用户控制器 用户使用电子邮件地址和密码登录 特殊用户可以通过在表单中 输入受邀者的电子邮件地址并点击提交来邀请其他用户 然后 受邀用户会收到一封邮件 其中包含用于激活其帐
  • MySQL RAND() 种子值几乎重复

    在 Windows 7 上使用 MySQL 5 6 21 我试图从按日期播种的表中返回 随机 行 因此同一行返回当天 然后切换第二天等 如果您愿意 可以是 当天生成器的随机引用 我注意到相同的行不断出现 因此我将查询简化为基础 看来 RAN
  • GO - WaitGroups 参考中的指针或变量

    根据sync包中的以下函数声明 添加 gt func wg WaitGroup Add delta int 完成 gt func wg WaitGroup Done 等待 gt func wg WaitGroup Wait 我知道它们都是由
  • 如何自动启动 Android 应用程序?

    我不确定如何在 Android 模拟器完成启动后自动启动 Android 应用程序 有人有任何代码片段可以帮助我吗 您必须添加清单权限条目
  • JPA @EmbeddedId:如何更新复合主键的一部分?

    我有一个多对多关系 其中链接表有一个附加属性 因此 链接表也由实体类表示 称为Composition 主键为Composition is an Embeddable链接到相应的实体 例如 2 ManyToOne参考 用户在选择两个引用中的任
  • 通过对其他列数据进行随机采样来创建新列

    我想通过从剩余列中随机采样数据来创建一个新列 考虑一个具有 N 列的数据框 如下所示 Column 1 Column 2 Column N 0 37 0 8 0 0
  • HTML 助手值得与复杂的标记一起使用吗?

    我应该坚持使用 HTML 助手 还是只使用纯 HTML 我使用 HTML 助手已经有一段时间了 并且非常喜欢使用它们 最近我开始使用 CSS 框架 例如推特引导程序我发现我的标记太复杂 无法使用标准 HTML 帮助程序 当然我还是用Url
  • 在 Shiny 中使用多个 tabPanel 时如何包含 showModal 和 modalDialog (如弹出窗口)

    我正在努力创建一个由多个选项卡组成的闪亮窗口 每个选项卡内都有一个下面的表单shinysurveys可以被填满 应用程序设计的代码可以显示选项卡及其内容 为了使应用程序提供更多信息 我想添加一条在每次单击 Tab1 时出现的消息 并且由于
  • 如何将字符串(例如“iso-8859-1”)转换为其 String.Encoding 对应项?

    从 Swift 发送 HTTP 请求后 我在响应中得到一个名为textEncodingName 我想转换data我还收到了一个包含其内容的字符串 为此 我使用String data data encoding utf8 这在大多数情况下都有
  • 如何在Android应用程序被杀死之前执行代码

    我有一个连接到周围设备的 Android 应用程序当前运行相同的应用程序 即使在后台 为此 我使用 WiFI Direct 来宣传我当前正在运行所述应用程序的事实 因此 一旦应用程序被终止 我就需要停止广告 onDestroy 无法使用 因
  • 如何将输入 File 对象序列化为 JSON?

    我想将 HTML 输入文件转换为 JSON 字符串 如下所示 var jsonString JSON stringify file console log file console log jsonString 现在 在我的 Firebug
  • 如何从类中访问Python模块的私有变量

    在 Python 3 中 为类变量添加前缀使其成为私有的 通过修改类中的名称 如何访问类中的模块变量 例如 以下两种方法不起作用 a 3 class B def init self self a a b B 结果是 Traceback mo
  • Http 响应文件下载在 Internet Explorer 和 Chrome 中不起作用(C#、Asp.net)

    我用 C asp net 编写了一个文件下载方法 用于将文件从服务器下载到客户端计算机 我写了以下代码 Response ContentType ReturnExtension System IO Path GetExtension fil
  • 将分隔字符串传递给存储过程以搜索数据库

    如何将由空格或逗号分隔的字符串传递给存储过程和过滤结果 我正在尝试做类似的事情 Parameter Value keywords key1 key2 key3 然后是我首先要的存储过程 查找所有包含第一个或最后一个的记录 名称如 key1