写存储过程时如何对传进去的参数进行字符串的匹配

本文介绍了一个SQL存储过程的实现方式,该过程能够根据输入的字符串查询表中的匹配记录。文章详细解释了如何使用CHARINDEX函数来查找指定字符串在目标字段中的位置,并提供了具体的SQL代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的存储过程如下:

ALTER PROCEDURE [dbo].[GET_MessagesManager_Messages]
@nameString varchar(30),
AS
BEGIN
  select * 
  from table
  where name like %@nameString%
END

想我查询table表中的name字段中包含@nameString中内容的数据,不怎么这个存储过程对吗?
如我传进来@nameString=“jay” ,如果name字段中有一个数据为 “jay Bob”,则把此数据select出来
如果我传进来的@nameString=“”,则把所有的数据都select出来,这个存储过程应该怎样写呢?

 

答案为:

where (charindex(@nameString,name) > 0 and @nameString <> '') or (1=1 and @nameString = '')

 

CHARINDEX

返回字符串中指定表达式的起始位置。

语法

CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数

expression1

一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

expression2

一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。

start_location

expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。

返回类型

int

注释

如果 expression1expression2 之一属于 Unicode 数据类型(nvarcharnchar)而另一个不属于,则将另一个转换为 Unicode 数据类型。

如果 expression1expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX 返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1expression2 都为 NULL 时返回 NULL 值。

如果在 expression2 内没有找到 expression1,则 CHARINDEX 返回 0。

示例

第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的 start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当 expression2 内找不到 expression1 时的结果集。

USE pubs
GO
SELECT CHARINDEX('wonderful', notes)
FROM titles
WHERE title_id = 'TC3218'
GO

-- Use the optional start_location parameter to start searching 
-- for wonderful starting with the fifth character in the notes
-- column.
USE pubs
GO
SELECT CHARINDEX('wonderful', notes, 5)
FROM titles
WHERE title_id = 'TC3218'
GO

下面是第一个查询和第二个查询的结果集:

----------- 
46          

(1 row(s) affected)

USE pubs
GO
SELECT CHARINDEX('wondrous', notes)
FROM titles
WHERE title_id='TC3218'
GO

下面是结果集。
----------- 
0          

(1 row(s) affected)
### C++ 中指针指向字符串的方法 在 C++ 中,可以通过字符指针来操作字符串。当声明一个 `char *` 类型的变量,这个变量实际上是指向单个字符或字符数组首地址的指针。 #### 声明与初始化 可以直接将字符串字面量赋予字符指针: ```cpp const char *p = "Hello world"; ``` 这里需要注意的是,由于字符串字面量是常量,在现代编译器中通常会自动将其视为 `const char[]` 或者 `const char*` 来防止意外修改[^2]。 也可以让指针指向已存在的字符数组的第一个元素: ```cpp char s[] = "Hello world"; char *q = s; ``` 此 q 和 p 都指向了各自的字符串起始位置,但是只有通过 q 修改其对应的字符串才是安全合法的操作,因为 s 是可变的而非只读属性。 #### 输出指针所指向的内容 对于普通的非字符类型的指针,默认情况下 cout 会尝试输出它们代表的对象而不是实际地址;然而一旦涉及到了 `char*` ,cout 则会被重载成按照连续字符序列的形式展示出来直至遇到终止符 `\0` 。为了得到真正的内存地址,需要显式地转换类型: ```cpp std::cout << static_cast<void*>(static_cast<const void*>(p)) << '\n'; // 或者更简单的方式是在某些平台上直接强转为其他指针类型比如 int* std::cout << reinterpret_cast<int*>(p); ``` 上述代码片段展示了如何正确获取并打印出指针本身的数值表示形式即地址值。 #### 动态分配空间存储字符串可能希望程序运行期间根据需求创建新的字符串副本而不影响原始数据源。这就需要利用 new 运算符申请堆区上的临缓冲区,并复制目标串进去: ```cpp size_t length = strlen(s)+1; // 计算所需长度加结束标记位 char *copy = new char[length]; strcpy(copy,s); // ... do something with copy ... delete [] copy; // 不再使用后记得释放资源以免泄漏 ``` 这段示范说明了怎样手动管理动态分配的空间以及确保不会造成内存溢漏问题[^4]。 #### 函数参数递方式 当设计接受字符串作为输入参数的功能模块,既可以采用入整个数组的方式(隐含递基址),也能选择单独给出指针变量。后者往往更加灵活高效,尤其是在面对大型文本块的候能够减少不必要的拷贝开销。 例如实现删除指定字符功能的小例子如下所示: ```cpp void delchar(char *str, char c){ if (!str || !*str) return; size_t writePos=0; for(size_t readPos=0 ; str[readPos]!='\0' ; ++readPos ){ if(str[readPos]!=c) str[writePos++]=str[readPos]; } str[writePos]='\0'; } ``` 此函数接收两个实参——待处理的目标字符串及其头部地址还有想要移除掉的那个特定字母。遍历过程中跳过匹配项并将剩余部分向前移动覆盖原处即可达到目的[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值